使用JPA(hibernate)和简单的oneToMany无法持久保存新的对象图 - ManyToOne关系

mos*_*jig 2 java sql hibernate jpa one-to-many

我试图通过jpa持久化/合并一个全新的对象图,但似乎持久性的顺序是不正确的,因为它试图保存对其父项存在约束的子对象.

public class ObjectA implements Serializable {
  ...
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "objectAId")
  private List<ObjectB> objectBList;
  ...
}
Run Code Online (Sandbox Code Playgroud)

public class ObjectB implements Serializable {
  ...
  @JoinColumn(name = "OBJECT_A_ID", referencedColumnName = "ID", nullable = false)
  @ManyToOne(optional = false)
  private ObjectA objectAId;
  ...
}
Run Code Online (Sandbox Code Playgroud)

我将创建一个新的实体ObjectA以及几个新的ObjectB实体并将它们添加到对象A.当我合并ObjectA时,我得到以下内容:

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.mycompany.data.ObjectB.objectAId
Run Code Online (Sandbox Code Playgroud)

我错过了什么或做错了什么?

axt*_*avt 9

您有责任将双向关系的双方保持在内存中对象的一致状态.换句话说,当你添加ObjectBObjectA.objectBList,你也应该ObjectB.objectAId指向相应的ObjectA.

而且,没有optional = false你能够没有错误地持久化对象,但是如果ObjectB.objectAId是,它们之间的关系将不会被持久化null.之所以会发生这种情况,是因为Hibernate在将数据保存到数据库时会查看关系拥有方的状态,并且在双向一对多关系的情况下,拥有方是"多"方(ObjectB)