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)
雙向關(guān)聯(lián)
配置多對一的關(guān)聯(lián)關(guān)系
- 以員工和部門為例,配置 員工到部門的單向多對一關(guān)聯(lián)
- 在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> |
- name :屬性名 這里就是 Employee中的dept
- column:外鍵字段 ,這里就是Employee表里的dept字段
- class :dept屬性對應(yīng)的類型 ,這里是 Dept類
- cascade:級聯(lián)操作 這里是 保存和修改
配置一對多的關(guān)聯(lián)關(guān)系
以員工和部門為例 ,從部門到員工的關(guān)聯(lián)就是 一對多的關(guān)聯(lián)
- 在Dept類中增加集合屬性用來保存所引用的員工對象
- 在映射文件中配置 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> |
- name :屬性名 ,集合屬性的名字
- key元素:column 屬性 設(shè)定與所關(guān)聯(lián)的持久化類對應(yīng)的表的外鍵,這里是employee表的dept外鍵字段名
- one-to-many :class屬性指定關(guān)聯(lián)的持久化類 這里對應(yīng)的是員工類
cascade 屬性 關(guān)聯(lián)操作
用于指定如何操作與當(dāng)前對象關(guān)聯(lián)的其他對象
可選值:
- none :默認(rèn)值 ;不關(guān)聯(lián)其他的對象
-
save-update 當(dāng)通過Session執(zhí)行
save()
,update()
及saveOrUpdate()
方法的時候級聯(lián)更新或者保存所關(guān)聯(lián)的對象 -
delete :當(dāng)通過
session的delete()
刪除當(dāng)前對象時,會級聯(lián) 刪除關(guān)聯(lián)對象; - 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)
以 員工和項目為例,一個員工可以參與到多個項目中,每個項目有多個員工的參于
- 配置 Project類 ,在類中添加集合屬性 用于保存員工引用
- 配置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> |
- set元素的table屬性 對應(yīng)第三張關(guān)聯(lián)表
- key元素的column屬性 對應(yīng)project表在第三張表的外鍵
- 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)系映射文件中配置加載策略
級別 | 說明 |
---|---|
類級別 |
|
一對多關(guān)聯(lián)級別 |
|
多對一關(guān)聯(lián)級別 |
|
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:https://sky-mxc.github.io/2017/01/13/hibernate-relate/