分享

Hibernate的父子关系和多对多的关系

 cherishchen 2006-12-02
http://www./user1/10477/archives/2006/20624.html Hibernate的父子关系和多对多的关系

在Hibernate中,在对象和对象间存在下面几种关系:一对一,一对多,多对一和多对多,一对一比较简单,这里我不讲了,今天主要谈谈父子关系和多对多的关系

   先谈谈父子关系.假设我们有一个简单的从 Parent Child对象的 <one-to-many> 关联:

<set name="children">

      <key column="parent_id"/>

      <one-to-many class="Child"/>

</set>

     建立了上面的映射,我们可以在编写下面的代码来实现

      Parent p=newParent();

      Child c=newChild();

     p.getChileren().add(c);

     session.save(p);

     session.flush();

     我们来分析下到底Hibernate为我们做了什么

     首先创建Insert语句来生成Child记录

     然后通过update来更新parent到child之间的关系

     但 是我们仔细分析发现这里面存在一个很大问题,问题出在insert一个child时候,这时把child记录中的parent_id设置为null,原因 在于这个时候还没有建立parent和child之间的关系,parent_id无法确定,如果在我们定义的child表中对parent_id不允许 null,那程序执行将会出错.对于这个问题的解决,简单的办法是将child表中的parent_id设置为允许null,但这不是一个好的设计,而且 可能对系统的执行效率带来影响.我们这里换种解决办法,建立child到parent的多对一的连接,因而我们在child.hbm.xml中加上下面一 句

<many-to-onename="parent"column="parent_id"not-null="true"/>

但需要注意,因为先前在child.hbm.xml中我们已经定义了到字段parent_id的关联,因此要把前面对字段parent_id定义的关联删除,否侧会造成重复定义,还有一点,需要修改下parent.hbm.xml

<setname="children"inverse="true">

   <keycolumn="parent_id"/>

   <one-to-manyclass="Child"/>

</set>

这里增加inverse="true",因为系统缺省inverse="false",inverse="true"的作用是将parent变成被调用方,从而告诉系统不用去更改连接,连接由child来完成,下面是JAVA代码实现

 Parent p=new Parent();

 Child c=newChild();

 c.setParent(p);

 p.getChileren().add(c);

 session.save(p);

 session.flush();

 

接下来我们谈谈多对多的关系,这种关系用的不多,原因在于需要额外生成表来维护这种关系,并且会造成对对象的反复查询,这里我们以role和group为例,一个role可以对应多个group,而一个group也同样对应多个role,我们在group.hbm.xml中加入下面的一段

<Set name=”roles” table=”t_group_role” inverse=”false” cascade=”save-update”>

<key column=”group_id”></key>

<many-to-many class=”Role” column=”role_id”/>

</Set>

其中t_group_role是group到role的映射表

我们这里将cascade 设置为save-update,而不是all,因为对于delete操作,如果设置为all,这样会在删除group时候把group对应的role一样 删除,这是我们不原意看到的,而设置为save-update不会有问题,在delete操作时候,不但不会删除role,同时由于设置了save- update而会更新t_group_role,删除掉t_group_role 中和group相关记录

相关的JAVA实现

Role role1=new Role();

Role role2=new Role();

Group group=new Group();

group.getRoles().add(role1);

group.getRoles().add(role2);

session.save(group);

session.flush();

 

对于Role.hbm.xml对groups采用类似的定义,这里不在叙述


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多