You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:00:04