上篇博客主要介绍了一对一的关系,主要理解单向与双向的差别,主键关联与唯一外键关联的差别。以下继续介绍一对多与多对多关联。
一对多关联映射
一个班级相应多个学生
单向一对多关系
关系表:
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的时候关系字段classesid为null,假设将该关系字段设置为非空,将无法保存数据;另外假设要更新语句,那么每存在一个学生就要更新一条语句。从而保证Classes和Student有关系,这样载入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>
双向一对多在多的一端维护关系增加外键。一的一端不维护关系,用inversekeyword反转更新,也就是一的一端不维护关系了,多的一端维护。同一时候在student端增加<many-to-one>标签
inverse属性:能够用在一对多和多对多双向关联上,inverse属性默觉得false,为false表示本端能够维护关系, 假设inverse为true,则本端不能维护关系,会交给还有一端维护关系。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端。那么此时两端共同维护关系,对关联一側所做的改变,会马上影响到还有一側。
————————————————————————————————————————
简单来说,一对一关联是通过主外键来维持关系,多对多关联是通过第三张表来维持关系。普通情况下,为了降低数据的冗余我们都建立第三张表,可是有时候为了项目的须要能够适当有冗余或者是为了开发的速度就直接用一张表了。