Hibernate多对一合并

时间:2012-07-31 12:11:24

标签: java hibernate orm

我有一个具有id,name和status的Person。状态是具有id和状态字符串的类Status 这很快就是netbeans工具为hibernate生成的代码

class Person{
   long id;
   String name;
   Status status;
   //getters and setters
}
class Status{
   long id;
   String status;
   List<Person> persons;
   //getters and setters
}

问题是当我想在会话中合并一个人时我得到状态为空

人p = getById(1L); //人名= XX;状态= 1

p.setName( “YY”);

session.merge(P); //这里状态为get NULL not-null属性引用null或transient值:model.Status

我知道hibernate在合并时会加载person对象,所以为什么状态返回为null; ??

2 个答案:

答案 0 :(得分:0)

在这种情况下,状态不为空,但它是瞬态的。您在合并此人包含的Person之前尝试合并Status。所以你试图在hibernate上下文中引入一个在上下文之外有引用的实体。解决方案是在合并人员之前合并状态或定义CascadeType.MERGE

答案 1 :(得分:0)

延迟加载仅在多对一引用使用另一个对象的主键时有效。而且还要避免在one2many关系上创建你的架构。

在person.hbm.xml文件中使用。

<set name="status" table="status" 
            inverse="true" lazy="false" fetch="select">
        <key>
            <column name="id" not-null="true" />
        </key>
        <one-to-many class="xxx.Status" />
 </set>

和status.hbm.xml应该是这样的;

 <many-to-one name="person" class="xxx.Person" fetch="select">
      <column name="id" not-null="true" />
 </many-to-one>

我希望它有所帮助。