Hibernate映射解析之關(guān)聯(lián)映射詳解
Hibernate中的關(guān)聯(lián)映射
關(guān)聯(lián)關(guān)系
平時(shí)開發(fā)中,類與類之間最普遍的的關(guān)系就是關(guān)聯(lián)關(guān)系,而且關(guān)聯(lián)是有方向的。
以部門(Dept)和員工(Employee)為例:一個(gè)部門下有多個(gè)員工,而一個(gè)員工只能屬于一個(gè)部門。
從Employee到Dept的關(guān)聯(lián)就是 多對一 關(guān)聯(lián)。 這就說明 每個(gè)Employee對象只會(huì)引用一個(gè)Dept對象,因此在Employee類中應(yīng)該定義一個(gè)Dept類型的屬性,來引用所關(guān)聯(lián)的Dept對象。
從Dept到Employee的關(guān)聯(lián)就是 一對多 關(guān)聯(lián)。這就說明 每個(gè)Dept對象會(huì)引用一組Employee對象,因此應(yīng)該在Employee類中定義一個(gè)集合類型的屬性,來引用所有關(guān)聯(lián)的Employee對象。
如果僅有從Employee到Dept的關(guān)聯(lián)或者僅有從Dept到Employee的關(guān)聯(lián),就稱為單向關(guān)聯(lián)。
如果同時(shí)包含兩種關(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)行配置
private Integer id; private String name; private Integer age; private Integer sex; private Dept dept; //引用所屬的部門
映射文件
<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
修改類屬性
private Integer id; private String name; private Set<Employee> employees = new HashSet<>(); //用來保存員工引用
修改映射文件
<!-- 配置一對多的關(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()
方法的時(shí)候級聯(lián)更新或者保存所關(guān)聯(lián)的對象 - delete :當(dāng)通過
session的delete()
刪除當(dāng)前對象時(shí),會(huì)級聯(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”‘的為主動(dòng)方,由主動(dòng)方負(fù)責(zé)維護(hù)關(guān)聯(lián)關(guān)系。
order-by屬性 指定集合內(nèi)元素的排序順序
這里以員工和部門為例,部門內(nèi)的員工要以年齡倒序的順序排序,就可以通過設(shè)置 order-by屬性
order-by="age desc"
多對多關(guān)聯(lián)
以 員工和項(xiàng)目為例,一個(gè)員工可以參與到多個(gè)項(xiàng)目中,每個(gè)項(xiàng)目有多個(gè)員工的參于
- 配置 Project類 ,在類中添加集合屬性 用于保存員工引用
- 配置Employee類,在類中添加集合睡醒,用于保存項(xiàng)目引用
往往多對多映射涉及到第三張表
Project類
private Integer id; private String name; private Set<Employee> employees = new HashSet<>();
配置Project映射類
<?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類
private Integer id; private String name; private Integer age; private Integer sex; private Dept dept; //引用所屬的部門 private Set<Project> projects = new HashSet<>(); //保存項(xiàng)目引用
Employee映射文件
<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對象時(shí),如果同時(shí)加載所有關(guān)聯(lián)的Employee對象,而我們僅僅需要Dept對象,那么這些關(guān)聯(lián)的對象就白白浪費(fèi)了許多內(nèi)存空間,這時(shí)就有了延遲加載,如果實(shí)際需要用到Employee時(shí)再去加載。hibernate使用lazy屬性指定延遲加載的查詢策略
hibernate允許在對象-關(guān)系映射文件中配置加載策略
級別 | 說明 |
---|---|
類級別 | |
一對多關(guān)聯(lián)級別 | |
多對一關(guān)聯(lián)級別 |
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
java 數(shù)據(jù)結(jié)構(gòu)與算法 (快速排序法)
這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)與算法(快速排序法),,快速排序法是實(shí)踐中的一種快速的排序算法,在c++或?qū)ava基本類型的排序中特別有用,下面我們一起進(jìn)入文章學(xué)習(xí)更詳細(xì)的內(nèi)容吧,需要的朋友可以參考下2022-02-02Java SiteMesh新手學(xué)習(xí)教程代碼案例
這篇文章主要介紹了Java SiteMesh新手學(xué)習(xí)教程代碼案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10Spring?Boot?Shiro?auto-configure工作流程詳解
這篇文章主要為大家介紹了Spring?Boot?Shiro?auto-configure工作流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02一文解決pom.xml報(bào)錯(cuò)Dependency "xxx" not f
我們在使用maven進(jìn)行jar包管理時(shí)有時(shí)會(huì)遇到pom.xml中報(bào)錯(cuò)Dependency “XXX” not found,所以在本文中將給大家介紹一下pom.xml報(bào)錯(cuò)Dependency "xxx" not found的解決方案,需要的朋友可以參考下2024-01-01Java如何通過ssh遠(yuǎn)程連接主機(jī)并執(zhí)行命令
這篇文章主要介紹了Java如何通過ssh遠(yuǎn)程連接主機(jī)并執(zhí)行命令問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07