hibernate多对一关联映射[关系:用户user(多)----组group(一)]
关联映射的本质:
* 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用
<many-to-one>会在多的一端加入一个外键 ,指向一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致
<many-to-one>标签的定义示例:
* <many-to-one name="group" column="groupid"/>
理解级联的含义?
* 是对象的连锁操作 <many-to-one name="group" column="group_id" cascade="save-update"/ >
如果不加cascade属性,并且不提前保存"一的"一端的对象,那么会出现以下情况:
//不能成功保存,抛出TransientObjectException异常
//因为Group为Tran sient状态,oid没有分配值
//persistent状态的对象是不能引用transient状态的对象的
====================================================================
hibernate一对一关联映射(分为主键单项关联和双向关联,唯一外键单项关联和双向关联) [关系:身份证idCard --- 人person]
<class name="Person" table="t_person">
<id name="id">
<!-- 单项主键关联,参照idcard的主键来关联-->
<generator class="foreign">
<param name="property">idCard</param>
</generator>
</id>
<property name="name" length="20"/>
<!-- constrained="true" 外键约束-->
<one-to-one name="idCard" constrained="true" />
</class>
+++++++++++++++++++++++++++++++++++++
<class name="IdCard" table="t_idcard">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_IDCARD_SEQUENCE</param>
</generator>
</id>
<property name="cardNo" length="20"/>
<one-to-one name="person" /> <!--单项关联没有此元素-->
</class>
-------------------------------------------------------------------------
one2one唯一外键关联,是多对一的特例,unique="true" 这个属性,保证数据库中该字段不重复
<class name="Person" table="t_person">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_PERSON_SEQUENCE</param>
</generator>
</id>
<property name="name" length="20"/>
<many-to-one name="idCard" unique="true" cascade="save-update"/>
</class>
+++++++++++++++++++++++++++++++++++++++++++
<class name="IdCard" table="t_idcard">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_IDCARD_SEQUENCE</param>
</generator>
</id>
<property name="cardNo" length="20"/>
<one-to-one name="person" property-ref="idCard"/> <!-- 单项关联没有此项-->
=======================================================
hibernate一对多关联映射(单双向) [关系:class(一)--- student(多)]
注意:一对多 级联删除的时候 ,删一的一端,有时会报错,说找到子记录,要把inverse=“true” 删除,才能实现不报错,但是,删除之后,只是把子记录的关联值设置为null而不会删除关联的子记录。(待更新 子记录删除的方法。。)
在class.java当中,有students的集合属性,private Set students.
单向:
<class name="Classes" table="t_classes">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_CLASSES_SEQUENCE</param>
</generator>
</id>
<property name="name" length="20"/>
<!-- students 是classes实体类中的Set集合-->
<!-- inverse="true"用于双向关联中,标识one2many标签失效,采用多的一端的many2one配置, cascade="all"用于双向关联当中,在用多的一端的配置关系进行保存的时候,会起到先持久一的一端的对象,然后进行多的一端的持久..-->
<set name="students " inverse="true" cascade="all">
<key column="classesid"></ key> <!--会在student表里,增加classesid字段,来进行关联-->
<one-to-many class="Student"/>
</set>
</class>
+++++++++++++++++++++++++++
<class name="Student" table="t_student">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_STUDENT_SEQUENCE</param>
</generator>
</id>
<property name="name" length="20"/>
<many-to-one name="classes" column="classesid" /> <!-- 用于双向关联,保证和单项关联都用一个外键进行关联-->
</class>
=======================================================
hibernate多对多关联映射(单双向) [关系:user(多)--- role(多)],多对多的单项双项关联区别不大,配置都一样{多个用户拥有多个权限,多个权限拥有多个用户}
注:多对多会出产生一张关系表
user.hbm.xml:
<class name="User" table="t_user">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_USER_SEQUENCE</param>
</generator>
</id>
<property name="name" length="20"/>
<set name="roles" table="t_user_roles "> 产生关系表
<key column="userid " /> user主键
<many-to-many class="Role" column="roleid " /> role主键,其中 "Role" 是user实体类的一个set集合 roleid关联role
</set>
</class>
+++++++++++++++++++++++++++++++++++++++++++++++++++++
Role.hbm.xml:
<class name="Role" table="t_role">
<id name="id">
<generator class="sequence">
<param name="sequence">TEST_ROLE_SEQUENCE</param>
</generator>
</id>
<property name="name" length="20"/>
<set name="users" table="t_user_roles "> 确保和user共同的一张关系表
<key column="roleid "></key> 确保和user操作的是同一个字段
<many-to-many class="User" column="userid "></many-to-many> 确保和user操作的是同一个字段
</set>
</class>
==============================================================
--------- 项目 关联关系 | *.hbm.xml | 描述 |
Many2one 用户2 组 | 多的一端(user.hbm.xml) 加入 : < many-to-one name = "group" column = "group_id" cascade = "save-update" /> | Group 为user 实体类中的一个对象 , 多个用户对应一个组, 会在多的一端加入一个外键 , 来指向一的一端 . 会在 user 一端加入 group_id 指向group 主键 , 在执行 save 的时候 , 确保 group 为持久状态 , |
One2one 人2 身份证 | person.hbm.xml 方法一: 主键关联 < id name = "id" > < generator class = "foreign" > < param name = "property" > idCard </ param > </ generator > </ id > < property name = "name" length = "20" /> < one-to-one name = "idCard" constrained = "true" /> 方法二: 唯一外键关联 : < many-to-one name = "idCard" unique = "true" cascade = "save-update" /> Idcard.hbm.xml < one-to-one name = "person" property-ref = "idCard" /> | Person和 idcard 的实体类中都有对方的属性 .
方法一:Person 的主键作为外键引用 idCard, 元素当中的 idCard 是 person 实体类中的属性 . constrained="true" 外键约束 方法二:many2one 特例 , 会产生一个外键来关联 idcard 的主键 , 实现一对一 .
这个property-ref 意思是 idcard 一对一参照 person 当中的 idcard 的外键 |
One2many Class2students | Class.hbm.xml: < set name = "students" inverse = "true" cascade = "all" > < key column = "classesid" / > < one-to-many class = "Student" /> </ set > Student.hbm.xml: < many-to-one name = "classes" column = "classesid" /> | Class当中有 students 的 set 集合 , inverse = "true" , 意思是让这种one-to-many 的映射关系失效 , 采用 student.hbm.xml 中的 many-to-on 反向的实现一对多 .
在student 一端产生一个外键来进行关联 Students当中有 class 对象属性 ,
|
Many2many 用户2 权限 | Role.hbm.xml : < set name = "users" table = "t_user_roles" > < key column = "roleid" ></ key > < many-to-many class = "User" column = "userid" ></ many-to-many > </ set > User.hbm.xml: < set name = "roles" table = "t_user_roles" > < key column = "userid" /> < many-to-many class = "Role" column = "roleid" /> </ set > | 多对多产生一张关系表 根据 table = "t_user_roles" 产生一张t_user_roles 关系表 , 需要注意的是: 双方都要配置同一张关系表 字段必须一致 才能实现多对多关联关系 |