2011-03-11 47 views
2

我试图通过jpa持久/合并一个全新的对象图,但它看起来像持久性的顺序不正确,因为它试图保存子对他们的父母存在约束的对象。无法使用简单的oneToMany - ManyToOne关系使用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; 
    ... 
} 

我将创建一个新的实体对象A并随着几个新的对象B实体并将其添加到对象A.当我合并对象A,我得到以下几点:

org.hibernate.PropertyValueException: not-null property references a null or transient value: com.mycompany.data.ObjectB.objectAId 

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

+0

仅供参考一个关于双向关系的好博客文章[here ...](http://blog.xebia.com/2009/03/16/jpa-implementation-patterns-bidirectional-assocations/) 该博客有许多与JPA相关的良好帖子... – 2011-04-05 16:44:38

回答

9

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

此外,没有optional = false您将能够无误地保留对象,但如果ObjectB.objectAIdnull,则它们之间的关系不会持续。发生这种情况的原因是,Hibernate在将其保存到数据库时查看关系的拥有状态,并且在拥有双向一对多关系的情况下,“多”一方(ObjectB

+1

+1。另请注意,关系的所有者一方是**,没有** mappedBy属性。因此,Hibernate会考虑的是从B到A而不是从A到B的关系 – 2011-03-11 16:40:45

+0

您是正确的先生。我没有正确解释例外。我用'ObjectA'设置了'ObjectB.objectAId',并且它按预期保持。谢谢! – mosgjig 2011-03-11 18:20:31