革新时会因为两岸都控制关系

1.单向多对多

 罗丝是多对多控制方:

 

 

 

Group是被控制方:不要求安插Set集合映射

 

 

炫耀文件

2.双向多对多

Group:

 

 

 

Role:

 

 

①多个布局文件都要配备many-to-many成分。

②日增
inverse属性,inverse属性负责控制关系,私下认可为false,也正是关乎的五头都能操纵,但如此会促成一些难题,更新时会因为两者都控制关系,于是再度更新。一般的话有一端要设为true。

③某一端设置为inverse=true,即表达另一端为控制端。 

 

照耀文件的陈设
  • name: 属性的名字。那些类的质量的名字,而且是与之提到的性质的名字
  • class (可选 – 暗许是经过反射获得的属性类型):被波及的类的名字。
  • cascade(级联) (可选):申明操作是还是不是从父对象级联到被波及的对象。
  • constrained(约束)
    (可选):注明该类对应的表对应的数目库表,和被提到的靶子所对应的数码库表之间,通过2个外键引用对主键举行约束。
    本条选项影响save()和delete()在级联执行时的先后顺序
    以及控制该关联能不可能被托付(也在schema export tool中被应用).
  • fetch (可选 – 私下认可设置为挑选): 在外连接抓取也许体系选择抓取选取其一.
  • property-ref
    (可选):钦命关联类的属性名,那一个天性将会和本类的主键相对应。
    借使没有点名,会利用对方关联类的主键。
  • access (可选 – 暗许是 property): Hibernate用来访问属性的策略。
  • formula (可选):绝超越二分一卓殊的涉及都指向其实体的主键。
    在局地久违的动静中,
    你恐怕会指向其余的3个或多少个字段,或然是贰个表明式,
    那么些意况下,你能够用二个SQL公式来代表。
    (能够在org.hibernate.test.onetooneformula找到例子)
  • lazy (可选 – 默许为 proxy):
    私下认可意况下,单点关联是经过代理的。lazy=”no-proxy”钦点此属性应该在实例变量第①遍被访问时应该延迟抓取(fetche
    lazily)(需求周转时字节码的增加)。
    lazy=”false”钦点此提到总是被优先抓取。注意,即使constrained=”false”,
    不只怕行使代理,Hibernate会采用先期抓取!
  • entity-name (可选): 被提到的类的实体名。

3.单向多对一

图片 1

 人-地址是独立的单向一对多的投射关系,特点是炫耀为单向,“多”的一方为主动方。一般都以“多”的一方设置3个外键来落到实处关系。

Person:

 

 

Address:

 

 

(1)由于是多对一关乎,控制方Person须求扩充Address属性,用来表示对应3个Address。

(2)多对一使用many-to-one成分。

(3)cascade属性表示当控制方(Person)在拓展添加、修改、删除时,是还是不是涉嫌被控制方(Address)。那里是save-update,即在增进、修改时涉嫌。

(4)outer-join设置为true,即在查询关联对象时,二个SQL语句就足以摸清;若是设置为false,则运用七个SQL语句查出数据。

一对一

一人对应一张身份证,一张身份证对应1个人

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.zts.day05.one2one">
<class name="Person" table="tbl_person">
    <id name="id" column="id">
        <generator class="increment" />
    </id>
    <property name="name" />
    <!--在主方配置一对一,property-ref="person"这个属性意味着主方的主键配置从方的外键,默认是主方的主键配置从方的主键 -->
    <one-to-one name="card" class="Card" property-ref="person" />
</class>
</hibernate-mapping>
  • <one-to-one name=”card” class=”Card” property-ref=”person”
    />
  • 在card.hbm.xml中配置
    <one-to-one name="person" class="Person" constrained="true"></one-to-one>

4.单向一对多

图片 2

 Company:

 

 

Employee:

 

 

 

(1)公司由于包蕴四个雇员,所以要求建立Set集合类型变量employees,用来对号入座“多”的一方。

(2)one-to-many属性要求钦命class属性值,对应“多”的一方。

(3)“多”的一方不需求安插关系。

 

再者由于一对一是异样的多对一中多为唯一的特例所以本着涉及属性大家也得以这么写:

<many-to-one name="person" class="Person" unique="true" column="p_id"/>

5.双向一对多(多对一)(常用)

图片 3

 双向的一对多(多对一)映射关系是异平时见的炫耀,是名列三甲的”父子”关系,在数据库中往往使用,必须领悟运用。

Father:

 

 

Son:

 

 

(1)father类中必须有集合类变量,对应“多”的一方。

(2)Son类中定义father类型变量,对应“一”的一方。

(3)须求在炫耀文件中分头安插many-to-one和one-to-many成分。

(4)维护关系的一方一般由“多”的一方来负担,那样功能比较高。本实例中,father的照耀文件中inverse=”true”,即将维护关系交给了son。

 

多对一

八个顾客对应多个订单,四个订单对应2个主顾

6.基于外键的单向一对一

图片 4

 

User:

 

 

(1)由于是单向映射,User中须要树立贰个email类型变量则email中不要求。

(2)使用many-to-one配置一对一映射,要求定义unique=”true”,即无法有双重的主键,就限制了“多”的一方必须成为“一”,那样实现了一对一映射。

(3)单向的一对一映射,只须求安排一方即可。

 

顾客
 <!--关联映射    false是延迟加载关联映射 ,默认为true-->
    <set name="orders" lazy="true"  cascade="all">
    <key column="c_id"></key>
    <one-to-many class="Order" />
    </set>

7.基于外键的双向一对一(常用)

User:

 

 

Email:

 

 

(1)双方都亟待有对方类型的变量属性。

(2)E-mail配置文件使用了one-to-one配置一对一映射。

(3)one-to-one配置有如下属性。

●name:属性的名字。

●class(可选,默许是经过反射得到的性质类型):被波及的类的名字。

●cascade(级联,可选):声明操作是不是从父对象级联到被提到的指标。

●constrained(约束,可选):表明该类对应的表对应的数据库表,和被提到的目的所对应的数量库表之间,通过1个外键引用对主键举办封锁。那么些选项影响save()和delete()在级联执行时的先后顺序(也在schema
export tool中被应用)。

●outer-join(外接连,可选,私下认可为自动):当设置hibernate.use_outer_join时,对这些涉及允许外接连抓取。

●property-ref(可选):内定关联类的2特性质,那脾个性将会和本外键相呼应。要是没有点名,会采纳对方关联类的主键。

●access(可选,暗中同意是property):Hibernate用来走访属性的策略。

(4)本实例property-ref=”email”,即关联到User类中的email变量。

 

订单
 <!--关联映射 -->
    <many-to-one name="customer" class="Customer" column="c_id"></many-to-one> 

8.基于主键的单向一对一

图片 5

基于主键的一对一映射,即多个表的主键值相同。单向一对一的景况不多,例如用户和电子邮件之间的关联,假定没有用户必须有唯一的电子邮件与之相应,而电子邮件能够没有对号入座的用户,即对应提到是单向的。

Emailpk:

 

 

Userpk:

 

 

(1)使用one-to-one配置基于主键的一对一映射。

(2)generator class=”foreign”意味着Emailpk使用外部主键,<param
name=”property”>userpk</param>配置了Emailpk使用Userpk的主键作为友好的主键,那样就兑现了依照主键的一对一映射。

(3)constrained=”true”表达userpk的主键值存在贰个羁绊,即emailpk使用了userpk的主键。

 

多对多

三个学员能够选多门课程,一名课程能够有多名学生选拔

#######学生

<set name=”courses” table=”tbl_student_course”>
<key column=”s_id”></key>
<many-to-many class=”Course”
column=”c_id”></many-to-many>
</set>
#######课程
<set name=”students” table=”tbl_student_course”>
<key column=”c_id”></key>
<many-to-many class=”Student”
column=”s_id”></many-to-many>
</set>
大家务必在
set标签那里进入二个table属性,那样就会暗许帮大家加载那些表。不然系统会自行帮小编创立四个表。

9.基于主键的双向一对一

Emailpk:

 

 

Userpk:

 

 

(1)双方都施用了one-to-one配置双向的一对一映射。

(2)注意inverse与cascade的涉及,那三个个性本人互不影响,但起的效果有个别接近,都能掀起对涉嫌表的立异。

●inverse只对set+one-to-many(或many-to-many)有效,对many-to-one、one-to-one无效。cascade对关系标记都使得。

●inverse对聚集对象全体起成效,cascade对聚集对象中的叁个一个要素起效果,如若集合为空,那么cascade不会吸引关联操作。

style=”line-height: 1.6″> ●起功能的空子不如:cascade在对主要控制方操作时,级联产生。inverse在flush时(commit会自动执行flush),对session中的全体set、Hibernate判断每个set是还是不是有生成,对有生成的set执行相应的sql,执行在此之前,会有个判断:if(inverse==true)return;能够看到cascade在先,inverse在后。

 

 

 

 

 

 

 

 

 

 

 

 

 

<wiz_tmp_tag id=”wiz-table-range-border” contenteditable=”false”
style=”display: none;”>

 

 

 

 

 

七个一对多

多对多我们能够看作是tbl_student对tbl_student_course(桥表)的一对多和tbl_course对tbl_student_course(桥表)的一对多。

#######学生
<set name=”stucous”>
<key column=”s_id”></key>
<one-to-many class=”Stucou” />
</set>
#######课程
<set name=”stucous”>
<key column=”c_id”></key>
<one-to-many class=”Stucou”/>
#######学生——课程

<many-to-one name=”student” class=”Student” column=”s_id”/>
<many-to-one name=”course” class=”Course” column=”c_id”/>
这么写的好处是:我们能够给桥表扩展属性比如:grade(分数),comment(评论)等等。

<set cascade=”all”,inverse=”false”/>多少个天性详解

级联操作

在炫耀文件中的关联成分中都有二个cascade属性,用来钦赐假使决定与当前指标关联的别的对象。eg:
cascade=”all”

  • none:
    在保存,更新,删除当前目的的时候不经意任何涉嫌的靶子。是cascade的私下认可值
  • save-update:
    当通过Session的save(),update(),saveOrUpdate()方法来保存还是更新当前目的的时候级联保存全部涉嫌的权且对象,级联更新具有涉及的游离对象。
  • delete:
    当通过Session的delete()方法删除当前指标的时候级联删除全部涉嫌的靶子。
  • all:包含save-update和delete的行为。
  • delete-orphan:删除所有和日前指标解除关系关系的靶子。(只能在set中配置
  • all-delete-orphan: 包含all和delete-orphan的行为

inverse:负责控制关系

暗许inverse=”false” 只好突显在<set>放实行安装

  1. inverse真正的职能是点名由哪一方来保卫安全之间的关联关系,当一方钦点inverse=”false”那么这一方就有权利担当之间的涉嫌关系。.供给将内部的一方inverse=”true”

  2. 在一对多涉及中,假诺选取暗中同意的inverse,那么意味着双方都得以保证关系关系,也就说在代码中得以只是用主方来维护从方,也足以用从方来爱慕主方,假诺双向珍爱将会有3遍重复更新。

  3. 在多对多关系中,如若用两者的外键来作为桥表的主键,只好一方来维护关系关系,意味着要求求将个中的一方设置为inverse=”true”,否则将会招致主键争辩的老大。