我试图通过jpa持久化/合并一个全新的对象图,但似乎持久性的顺序不正确,因为它试图保存对其父项存在约束的子对象。
public class ObjectA implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "objectAId")
private List<ObjectB> objectBList;
...
}
和
public class ObjectB implements Serializable {
...
@JoinColumn(name = "OBJECT_A_ID", referencedColumnName = "ID", nullable = false)
@ManyToOne(optional = false)
private ObjectA objectAId;
...
}
我将创建一个新实体ObjectA以及几个新的ObjectB实体并将它们添加到Object A.当我合并ObjectA时,我得到以下内容:
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.mycompany.data.ObjectB.objectAId
我错过了什么或做错了什么?
答案 0 :(得分:9)
您有责任将双向关系的双方保持在内存中对象的一致状态。换句话说,当您将ObjectB
添加到ObjectA.objectBList
时,您还应该ObjectB.objectAId
指向相应的ObjectA
。
此外,如果没有optional = false
,您就可以保持对象没有错误,但如果ObjectB.objectAId
为null
,则不会保留它们之间的关系。之所以会发生这种情况,是因为Hibernate在将数据保存到数据库时会查看关系拥有方的状态,而在双向一对多关系的情况下,拥有方是“多”方(ObjectB
)