hibernate关联映射

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 关系表 ,

需要注意的是: 双方都要配置同一张关系表

字段必须一致 才能实现多对多关联关系

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值