一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Hibernate映射解析之關(guān)聯(lián)映射詳解

Hibernate映射解析之關(guān)聯(lián)映射詳解

2020-08-20 10:59孟祥超 Java教程

所謂關(guān)聯(lián)映射就是將關(guān)聯(lián)關(guān)系映射到數(shù)據(jù)庫里,在對象模型中就是一個或多個引用。下面這篇文章詳細(xì)的給大家介紹了Hibernate映射解析之關(guān)聯(lián)映射的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。

Hibernate中的關(guān)聯(lián)映射

關(guān)聯(lián)關(guān)系

平時開發(fā)中,類與類之間最普遍的的關(guān)系就是關(guān)聯(lián)關(guān)系,而且關(guān)聯(lián)是有方向的。
以部門(Dept)和員工(Employee)為例:一個部門下有多個員工,而一個員工只能屬于一個部門。

從Employee到Dept的關(guān)聯(lián)就是 多對一 關(guān)聯(lián)。 這就說明 每個Employee對象只會引用一個Dept對象,因此在Employee類中應(yīng)該定義一個Dept類型的屬性,來引用所關(guān)聯(lián)的Dept對象。

從Dept到Employee的關(guān)聯(lián)就是 一對多 關(guān)聯(lián)。這就說明 每個Dept對象會引用一組Employee對象,因此應(yīng)該在Employee類中定義一個集合類型的屬性,來引用所有關(guān)聯(lián)的Employee對象。

如果僅有從Employee到Dept的關(guān)聯(lián)或者僅有從Dept到Employee的關(guān)聯(lián),就稱為單向關(guān)聯(lián)。
如果同時包含兩種關(guān)聯(lián),就是雙向關(guān)聯(lián)。

單向關(guān)聯(lián)

Hibernate映射解析之關(guān)聯(lián)映射詳解

雙向關(guān)聯(lián)

Hibernate映射解析之關(guān)聯(lián)映射詳解

配置多對一的關(guān)聯(lián)關(guān)系

  1. 以員工和部門為例,配置 員工到部門的單向多對一關(guān)聯(lián)
  2. 在Employee類中定義Dept類型的屬性 dept;

配置文件中配置 使用'many-to-one'進(jìn)行配置

?
1
2
3
4
5
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Dept dept; //引用所屬的部門

映射文件

?
1
<many-to-one name="dept" column="dept" class="com.ytzl.demo.entity.Dept" cascade="save-update"></many-to-one>
  1. name :屬性名 這里就是 Employee中的dept
  2. column:外鍵字段 ,這里就是Employee表里的dept字段
  3. class :dept屬性對應(yīng)的類型 ,這里是 Dept類
  4. cascade:級聯(lián)操作 這里是 保存和修改

配置一對多的關(guān)聯(lián)關(guān)系

以員工和部門為例 ,從部門到員工的關(guān)聯(lián)就是 一對多的關(guān)聯(lián)

  1. 在Dept類中增加集合屬性用來保存所引用的員工對象
  2. 在映射文件中配置 set

修改類屬性

?
1
2
3
private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>(); //用來保存員工引用

修改映射文件

?
1
2
3
4
5
<!-- 配置一對多的關(guān)聯(lián) -->
<set name="employees"> <!-- name 對應(yīng)的屬性名 就是集合的名字 -->
 <key column="dept"></key> <!-- 對應(yīng)的是 employee表的外鍵字段名 -->
 <one-to-many class="com.ytzl.demo.entity.Employee"/> <!-- 關(guān)聯(lián)的類 這里是 員工類 -->
</set>
  1. name :屬性名 ,集合屬性的名字
  2. key元素:column 屬性 設(shè)定與所關(guān)聯(lián)的持久化類對應(yīng)的表的外鍵,這里是employee表的dept外鍵字段名
  3. one-to-many :class屬性指定關(guān)聯(lián)的持久化類 這里對應(yīng)的是員工類

cascade 屬性 關(guān)聯(lián)操作

用于指定如何操作與當(dāng)前對象關(guān)聯(lián)的其他對象

可選值:

  1. none :默認(rèn)值 ;不關(guān)聯(lián)其他的對象
  2. save-update 當(dāng)通過Session執(zhí)行 save() ,update()saveOrUpdate()方法的時候級聯(lián)更新或者保存所關(guān)聯(lián)的對象
  3. delete :當(dāng)通過session的delete()刪除當(dāng)前對象時,會級聯(lián) 刪除關(guān)聯(lián)對象;
  4. all :包含 delete,save-update的行為

inverse屬性 反轉(zhuǎn)屬性

在hibernate中,'inverse'屬性指定了關(guān)聯(lián)關(guān)系中的方向。

關(guān)聯(lián)關(guān)系中,'inverse=”false”‘的為主動方,由主動方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系。

order-by屬性 指定集合內(nèi)元素的排序順序

這里以員工和部門為例,部門內(nèi)的員工要以年齡倒序的順序排序,就可以通過設(shè)置 order-by屬性

?
1
order-by="age desc"

多對多關(guān)聯(lián)

以 員工和項目為例,一個員工可以參與到多個項目中,每個項目有多個員工的參于

  1. 配置 Project類 ,在類中添加集合屬性 用于保存員工引用
  2. 配置Employee類,在類中添加集合睡醒,用于保存項目引用

往往多對多映射涉及到第三張表

Project類

?
1
2
3
private Integer id;
private String name;
private Set<Employee> employees = new HashSet<>();

配置Project映射類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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>
 <class name= "com.ytzl.demo.entity.Project" table ="project" dynamic-update="true">
 <id name="id" column="p_id" type="java.lang.Integer">
 <generator class="increment"></generator>
 </id>
 <property name="name" column="p_name" type="java.lang.String"></property>
 <set name="employees" table="emp_pro_relate" cascade="save-update">
 <key column="pro_id"></key>
 <many-to-many class="com.ytzl.demo.entity.Employee" column="emp_id"></many-to-many>
 </set>
 </class>
 </hibernate-mapping>
  1. set元素的table屬性 對應(yīng)第三張關(guān)聯(lián)表
  2. key元素的column屬性 對應(yīng)project表在第三張表的外鍵
  3. many-to-many 元素 column對應(yīng)關(guān)聯(lián)對象在第三張表的外鍵

Employee類

?
1
2
3
4
5
6
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Dept dept; //引用所屬的部門
private Set<Project> projects = new HashSet<>(); //保存項目引用

Employee映射文件

?
1
2
3
4
<set name="projects" table="emp_pro_relate" inverse="true">
 <key column="emp_id"></key>
 <many-to-many class="com.ytzl.demo.entity.Project" column="pro_id"></many-to-many>
</set>

延遲加載

當(dāng)hibernate從數(shù)據(jù)庫中加載Dept對象時,如果同時加載所有關(guān)聯(lián)的Employee對象,而我們僅僅需要Dept對象,那么這些關(guān)聯(lián)的對象就白白浪費(fèi)了許多內(nèi)存空間,這時就有了延遲加載,如果實(shí)際需要用到Employee時再去加載。hibernate使用lazy屬性指定延遲加載的查詢策略

hibernate允許在對象-關(guān)系映射文件中配置加載策略

 

級別 說明
類級別 元素中l(wèi)azy屬性可選值為 true(延遲加載)和false(立即加載);默認(rèn)值是true;
一對多關(guān)聯(lián)級別 元素中l(wèi)azy屬性的可選值為 :true(延遲加載) ,extra(增強(qiáng)延遲加載),false(立即加載) 默認(rèn)值為 true
多對一關(guān)聯(lián)級別 元素中l(wèi)azy屬性的可選值為 :proxy(延遲加載),no-proxy(無代理延遲加載),和false(立即加載) ;默認(rèn)值為 proxy

 

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。

原文鏈接:https://sky-mxc.github.io/2017/01/13/hibernate-relate/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产性视频 | 成人网视频免费播放 | 美女张开下身让男人桶 | 国产麻豆91网在线看 | 91精品国产色综合久久不卡蜜 | 日本三级在丈面前被耍了 | 三叶草私人研究所 | 国产成人一区二区三区视频免费蜜 | 久久精品热在线观看30 | 日韩在线 中文字幕 | 国语刺激对白勾搭视频在线观看 | 公共场合高h短篇 | 欧美一级片免费在线观看 | 调教老师肉色丝袜的故事 | 国内视频一区二区 | 成人亚洲欧美综合 | 欧美黑人成人免费全部 | 青青草影院在线观看 | 黄a级 | www.一区二区三区.com | 93版高校教师 | 黑人艹| 国产精品欧美一区二区 | 欧美在线观看一区二区三 | 亚洲精品影视 | 末发育xxxxx仙踪林 | 欧美在线观看网址 | 五月天精品视频播放在线观看 | 波多野结衣 在线播放 | 婚前试爱免费观看 | 经典WC女厕所里TV | 超鹏97国语 | 午夜影院0606 | 亚洲精品国产成人99久久 | 无人区乱码区1卡2卡三卡在线 | 沉香如屑西瓜视频免费观看完整版 | 亚洲色大成网站www久久九九 | 午夜网 | 欧美日韩国产最新一区二区 | 男人网站视频 | 精品videoss另类日本 |