Hibernate PropertyValueException求助:非空属性引用空值/瞬时值
解决Hibernate双向关联导致的PropertyValueException问题
嘿,这个错误我太熟了——典型的双向关联维护不当踩坑!咱们一步步来搞定它:
1. 先看映射配置的核心问题
你的Partner映射里的<set>标签设置了inverse="false",这就告诉Hibernate:Partner是双向关联的维护方。但实际数据库里,ADVICENOTE表的PARTNER_ID外键是挂在Advicenote这一侧的,应该由Advicenote(也就是many-to-one的那端)来负责维护关联关系。
把Partner映射里的<set>标签的inverse改成true,让Partner变成被维护端:
<set name="advicenotes" table="ADVICENOTE" inverse="true" cascade="all" lazy="true" fetch="select"> <key column="PARTNER_ID" not-null="true"/> <one-to-many class="classes.Advicenote" /> </set>
2. 完善业务代码的关联维护
光改配置还不够,内存里的对象模型也要保持一致。你现在只给Advicenote设置了Partner,但没把Advicenote加到Partner的advicenotes集合里,这会导致Hibernate检查关联时认为有缺失,触发非空报错。
修改你的两个按钮监听器代码,添加集合维护的逻辑:
入库按钮(deliveryButtonActionPerformed)修改后:
private void deliveryButtonActionPerformed(java.awt.event.ActionEvent evt) { session = sessionFactory.openSession(); transaction = session.beginTransaction(); advice.setAdvicedate((Date) this.dateSpinner.getValue()); advice.setInOrOut((short)1); Criteria criteria = session.createCriteria(Partner.class); partner = (Partner) criteria.add(Restrictions.eq("partnerName", this.partnerComboBox.getSelectedItem())).uniqueResult(); // 关键:把当前Advicenote添加到Partner的集合中,维护双向关联 partner.getAdvicenotes().add(advice); advice.setPartner(partner); session.save(advice); transaction.commit(); session.close(); delivery.setVisible(true); }
出库按钮(transferButtonActionPerformed)修改后:
private void transferButtonActionPerformed(java.awt.event.ActionEvent evt) { session = sessionFactory.openSession(); transaction = session.beginTransaction(); advice.setAdvicedate((Date) this.dateSpinner.getValue()); advice.setInOrOut((short)-1); Criteria criteria = session.createCriteria(Partner.class); partner = (Partner) criteria.add(Restrictions.eq("partnerName", this.partnerComboBox.getSelectedItem().toString())).uniqueResult(); // 同样维护双向关联 partner.getAdvicenotes().add(advice); advice.setPartner(partner); session.save(advice); transaction.commit(); session.close(); transfer.setVisible(true); }
3. 额外的小提醒
别忘了在Partner类的构造函数里初始化advicenotes集合,比如:
public Partner() { this.advicenotes = new HashSet<>(); }
不然调用partner.getAdvicenotes().add(advice)的时候会报NullPointerException哦!
这样调整之后,Hibernate就能正确处理双向关联的持久化逻辑,那个烦人的PropertyValueException就会消失啦。
内容的提问来源于stack exchange,提问作者Fluellen
相关产品推荐
相关产品推荐

