2012-07-31 92 views
0

我有一个具有ID,名称和状态的人员。状态是一类状态与ID和状态字符串 这是前不久通过的NetBeans工具,休眠休眠多对一合并

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

生成的代码的问题是,当我想合并会话的人,我得到了状态空

Person p = getById(1L); //人名= XX; status = 1

p.setName(“YY”);

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

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

回答

0

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

0

仅当多对一引用使用其他对象的主键时,延迟加载才起作用。同时也避免在一对二的关系上创建你的架构。

在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> 

我希望它有帮助。