我有一个具有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; ??
答案 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>
我希望它有所帮助。