首页 > 代码库 > 【Hibernate学习】 ——ORM(二)

【Hibernate学习】 ——ORM(二)

         上篇博客主要介绍了一对一的关系,主要理解单向与双向的区别,主键关联与唯一外键关联的区别。下面继续介绍一对多与多对多关联。

 

一对多关联映射

         一个班级对应多个学生


      单向一对多关系

关系表:


          classes代码

<classname="com.bjpowernode.hibernat.Classes"table="t_classes">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
 
<setname="students">
<!--维护关系-->
<keycolumn="classesid"/>
<one-to-manyclass="com.bjpowernode.hibernate.Student"/>
</set>
</class>

student代码

<classname="com.bjpowernode.hibernate.student"table="t_student">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
</class>

        由班级维护关系,所以要在一的一端加入set标签。set用来存放集合,存放多个student对象。

 


一对多与多对一的区别:

        一对多和多对一映射原理是一样的,都是在多的一端加入一个外键指向一的一端。其实这个就跟我们在做ER模型中是一样的,把一的一端的主键放在多的一端当外键。

 

小结:

         在一的一端维护关系也就是在Classes一端维护关系,Student端不维护关系,也就是Student不知道Classes的存在,所以在保存Student的时候关系字段classesidnull,如果将该关系字段设置为非空,将无法保存数据;另外如果要更新语句,那么每存在一个学生就要更新一条语句,从而保证ClassesStudent有关系,这样加载Classes的时候才可以把该Classes对应的学生加载上来。

 

————————————————————————————————————————


双向一对多关系

         由于一的一端维护关系效率并不高,为了解决单向一对多的缺陷,产生了双向一对多的关系。

 

      关系表:


         classes代码

<classname="com.bjpowernode.hibernat.Classes"table="t_classes">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
 
<setname="students" inverse="true">
<!--
<keycolumn="classesid" not-null="true"/>
-->
<keycolumn="classesid"/>
<one-to-manyclass="com.bjpowernode.hibernate.Student"/>
</set>
</class>


student代码

<classname="com.bjpowernode.hibernate.student"table="t_student">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<many-to-onename="classes" column="classesid"/>
</class>


         双向一对多在多的一端维护关系加入外键,一的一端不维护关系,用inverse关键字反转更新,也就是一的一端不维护关系了,多的一端维护。同时在student端加入<many-to-one>标签

      

          inverse属性:可以用在一对多和多对多双向关联上,inverse属性默认为false,为false表示本端可以维护关系,如果inversetrue,则本端不能维护关系,会交给另一端维护关系。inverse属性石控制方向上的反转,只影响存储;cascade是操作上的连线反应。

       注意:<key>标签和<many-to-one>标签加入的字段要保持一致,否则会产生数据混乱。

 

双向和单向区别:

          只是维护关系的对象不同,单向通过一端维护关系,效率不高,通俗点就是,每个学生都需要找自己的班级;而双向的是student维护关系,这时只需要知道这个班级都有谁就可以了。

————————————————————————————————————————


多对多关联映射


        也就是一个用户对应多个角色,一个角色对应多个用户。借助于第三张表

        单向

              关系表:


                 User维护关系。


           User代码:

<classname="com.bjpowernode.hibernate.User" table="t_user">
<idname="id">
<generatorclass="native">
</id>
<propertyname="name">
<!--生成第三张关系表,其中主键为user_id,另一个字段为role_id-->
<!--由于是多对多的关系,所以使用set集合-->
<setname="roles" table="t_user_role">
<keycolumn ="user_id"/>
<many-to-manyclass="com.bjpowernode.hibernate.Role"column="role_id"/>
</set>
</class>
 

Role代码:

<classname="com.bjpowernode.hibernate.Role" table="t_role">
<idname="id">
<generatorclass="native"/>
</id>
</class>


 

        双向

        关系表:


           role关系

<classname="com.bjpowernode.hibernate.Role" table="t_role">
<idname="id">
<generatorclass="native"/>
</id>
<propertyname="name"/>
<setname="users" table="t_user_role">
<keycolumn="role_id"/>
<many-to-manyclass="com.bjpowernode.hibernate.User"column="user_id"/>
</set>
</class>

         user关系

        role关系配置相同,同上。

 

小结:

          单向关联是在user端持有role对象,role端并不持有user端对象,只能从user端导航到role端,不能从role端导航到user端;双向关联是在单向基础上,加上role端持有user对象,所以在role端加上user对象的set集合。故双向关联是既能从user端导航到role端,也能从role端导航到user端,那么此时两端共同维护关系,对关联一侧所做的改变,会立即影响到另一侧。

 

————————————————————————————————————————

 

         简单来说,一对一关联是通过主外键来维持关系,多对多关联是通过第三张表来维持关系。一般情况下,为了减少数据的冗余我们都建立第三张表,但是有时候为了项目的需要可以适当有冗余或者是为了开发的速度就直接用一张表了。