Java 无法使用JPA(hibernate)和简单的一对一-多对一关系来持久化新的对象图
我试图通过jpa持久化/合并一个全新的对象图,但持久化的顺序似乎不正确,因为它试图保存对其父对象存在约束的子对象Java 无法使用JPA(hibernate)和简单的一对一-多对一关系来持久化新的对象图,java,sql,hibernate,jpa,one-to-many,Java,Sql,Hibernate,Jpa,One To Many,我试图通过jpa持久化/合并一个全新的对象图,但持久化的顺序似乎不正确,因为它试图保存对其父对象存在约束的子对象 public class ObjectA implements Serializable { ... @OneToMany(cascade = CascadeType.ALL, mappedBy = "objectAId") private List<ObjectB> objectBList; ... } 我将创建一个新实体ObjectA和几个新的Obj
public class ObjectA implements Serializable {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy = "objectAId")
private List<ObjectB> objectBList;
...
}
我将创建一个新实体ObjectA和几个新的ObjectB实体,并将它们添加到对象a中。合并ObjectA时,我得到以下结果:
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.mycompany.data.ObjectB.objectAId
我遗漏了什么或做错了什么?对于内存中的对象,您有责任保持双向关系的双方处于一致状态。换句话说,当您将
ObjectB
添加到ObjectA.objectBList
时,还应该使ObjectB.objectAId
指向相应的ObjectA
此外,如果没有
optional=false
,您将能够持久化对象而不会出错,但是如果ObjectB.objectAId
为null
,则它们之间的关系将不会持久化。之所以会发生这种情况,是因为Hibernate在将关系保存到数据库时会查看其拥有方的状态,而在双向一对多关系的情况下,拥有方是“多”方(ObjectB
)+1。还要注意,关系的所有者端是不带mappedBy属性的一方。所以,Hibernate要考虑的是从B到A的关系,而不是从A到BYou是正确的,先生。我未能正确解释这个例外。我用ObjectA
设置了ObjectB.objectAId
,并且它按预期保持。谢谢仅供参考-有一篇关于双向关系的博文,博文中有很多与JPA相关的博文。。。
org.hibernate.PropertyValueException: not-null property references a null or transient value: com.mycompany.data.ObjectB.objectAId