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

时间:2011-03-11 16:33:06

标签: java sql hibernate jpa one-to-many

我试图通过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

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

1 个答案:

答案 0 :(得分:9)

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

此外,如果没有optional = false,您就可以保持对象没有错误,但如果ObjectB.objectAIdnull,则不会保留它们之间的关系。之所以会发生这种情况,是因为Hibernate在将数据保存到数据库时会查看关系拥有方的状态,而在双向一对多关系的情况下,拥有方是“多”方(ObjectB