hibernate关系映射——关联映射

    hibernate几种映射关系:

  • 关联映射
  • 继承映射
  • 复合主键映射
  • Component映射
  • 集合映射

      下面主要介绍关联映射。关联映射就是将对象的关联关系映射到数据库中。

       关联映射包括:一对多关联映射、多对一关联映射、多对多关联映射

        1. 一对多关联映射

             一对多关联关系分为单项关联关系和双项关联关系。

            (1)单项关联

                  Group (1)----->User(*)

                  从对象关系图中可以看出,在Group对象中持有User对象的集合。

                  添加数据时,由Group一端维护关系,维护的是t_user表中的groupid字段。

                  group.hbm.xml:

                  <set name="user">   
                            <key column="groupid"/>      //关联的外键为groupid
                            <one-to-many class="com.bjpowernode.hibernate.Group"/>
                   </set>

                   加载数据时,加载group的同时,能够将user加载出来。

                   缺点:

                    a. 因为User一端不知道Group的存在(因为User没有维护关系),所以,在保存User时,关系字段groupid是为null的,如果将该字段设置为非空,则将无法保存数据。

                    b. 由于是Group维护关系,所以,每次添加数据时,group都要执行update命令来更新User中的groupid字段。

                        Hibernate: insert into t_user (name) values (?)
                        Hibernate: insert into t_group (name) values (?)
                        Hibernate: update t_user set groupid=? where id=? //每次插入时都要生成update语句

                    下面介绍的双项关联,解决了单项关联的缺点。

                 (2) 双项关联

                   Group (1)-----User(*)

              从对象关系图中可以看出,在Group对象中持有User对象的集合;在User中持有Group对象的引用。

              添加数据时,多的一端维护数据,group一端维护关系的语句设置为失效(inverse=true),维护的是t_user表中的groupid字段。

               user.hbm.xml:
                <many-to-one name="classes" column="classesid"/>
                group.hbm.xml:
                <set name="students" inverse ="true">                  

                      <key column="classesid"/>
                     <one-to-many    class="com.bjpowernode.hibernate.Student"/>
               </set>

           加载数据时,同单项关联关系一样,加载group的同时,能够将对应的user加载上来;和单项关联关系不同的是,加载user的同时,也能够将group加载上来。这是单项关联无法做到的。实际上,由加载多的一端加载出一的数据是更合理的。

             2. 多对一关联映射

                多对一关联映射和一对多的双项关联类似,都是在多的一端持有一的一端的集合。都是用<many-to-one>属性,在加载多的时候能够将一的信息加载上来。

             3. 多对多关联映射

               (1) 单项关联映射

                User(*)----->Role(*)

               从对象关系中可以看出,在User中持有Role的集合。

               添加数据时,User维护关系,维护的是一个第三方表t_user_role

               user.hbm.xml:
               <set name="roles" table="t_user_role">
                        <key column="user_id"></key>  
                        <many-to-many  class="com.bjpowernode.hibernate.Role" column="role_id" />
                </set>

               在加载数据的时候,加载User时能够同时加载Role的信息。

               (2) 双项关联映射

                User(*)-----role(*)

               从对象关系中可以看出,双方对象中互相持有对方的集合。

                添加数据时,共同维护第三方表t_user_role

               user.hbm.xml:
               <set name="roles" table="t_user_role">
                         <key column="user_id"></key> 
                        <many-to-many  class="com.bjpowernode.hibernate.Role" column="role_id" />
              </set>

              role.hbm.xml:
             <set name="users" table="t_user_role">
                         <key column="role_id"></key>
                         <many-to-many   class="com.bjpowernode.hibernate.User" column="user_id"
             </set>

              加载数据时,从任意一方都能够加载出对应的另一方的信息。

 

          一对多关联映射:通过在多的一端加入一个外键,指向一的一端来维护关系。

         多对一关联映射:通过在多的一端加入一个外键,指向一的一端来维护关系。

         多对多关联映射:通过一张第三方表来维护关系。

         我觉得映射关系只要按照对象之间的关系来对应就好了。一对多的单项关联就是在一的一端持有多的一端的集合,双向关联就是一的一端持有多的一端的集合,多的一端持有一的一端的引用。 多对多就是双方互相持有对方的集合。

          在单项关联中,哪个对象持有对方的集合或者引用,哪个对象维护关系。在双项关联中,双方共同维护关系。

          多对一的关系用<many-to-one>属性 ,一对多用<one-to-many>属性, 多对多用<many-to-many>属性。

           一的一端维护数据时,加载一时能够加载出多的数据,多的一端维护数据时,加载多时能够加载一的数据。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值