0

我有一个带有 id、name 和 status 的类 Person 。status 是一个带有 id 的类 Status,而 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
}

问题是当我想在会话中合并一个人时,我的状态为 null

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

p.setName("YY");

session.merge(p); // 这里的状态是获取 NULL 非空属性引用一个空值或瞬态值:model.Status

我知道在合并时休眠会加载人员对象,所以为什么状态返回为空;??

4

2 回答 2

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>

我希望它有帮助。

于 2012-07-31T12:30:56.733 回答
0

在这种情况下,状态不是空的,而是暂时的。您正在尝试在合并该人包含的Person之前进行合并。Status所以你试图在休眠上下文中引入一个在上下文之外具有引用的实体。解决方案是在合并人员之前合并状态或定义CascadeType.MERGE

于 2012-07-31T12:25:17.767 回答