您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關深入淺析Hibernate中的關聯映射,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
Hibernate中的關聯映射
關聯關系
平時開發中,類與類之間最普遍的的關系就是關聯關系,而且關聯是有方向的。
以部門(Dept)和員工(Employee)為例:一個部門下有多個員工,而一個員工只能屬于一個部門。
從Employee到Dept的關聯就是 多對一 關聯。 這就說明 每個Employee對象只會引用一個Dept對象,因此在Employee類中應該定義一個Dept類型的屬性,來引用所關聯的Dept對象。
從Dept到Employee的關聯就是 一對多 關聯。這就說明 每個Dept對象會引用一組Employee對象,因此應該在Employee類中定義一個集合類型的屬性,來引用所有關聯的Employee對象。
如果僅有從Employee到Dept的關聯或者僅有從Dept到Employee的關聯,就稱為單向關聯。
如果同時包含兩種關聯,就是雙向關聯。
單向關聯
雙向關聯
配置多對一的關聯關系
配置文件中配置 使用'many-to-one'進行配置
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>
配置一對多的關聯關系
以員工和部門為例 ,從部門到員工的關聯就是 一對多的關聯
修改類屬性
private Integer id; private String name; private Set<Employee> employees = new HashSet<>(); //用來保存員工引用
修改映射文件
<!-- 配置一對多的關聯 --> <set name="employees"> <!-- name 對應的屬性名 就是集合的名字 --> <key column="dept"></key> <!-- 對應的是 employee表的外鍵字段名 --> <one-to-many class="com.ytzl.demo.entity.Employee"/> <!-- 關聯的類 這里是 員工類 --> </set>
cascade 屬性 關聯操作
用于指定如何操作與當前對象關聯的其他對象
可選值:
save()
,update()
及saveOrUpdate()
方法的時候級聯更新或者保存所關聯的對象session的delete()
刪除當前對象時,會級聯 刪除關聯對象;inverse屬性 反轉屬性
在hibernate中,'inverse'屬性指定了關聯關系中的方向。
關聯關系中,'inverse=”false”‘的為主動方,由主動方負責維護關聯關系。
order-by屬性 指定集合內元素的排序順序
這里以員工和部門為例,部門內的員工要以年齡倒序的順序排序,就可以通過設置 order-by屬性
order-by="age desc"
多對多關聯
以 員工和項目為例,一個員工可以參與到多個項目中,每個項目有多個員工的參于
往往多對多映射涉及到第三張表
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>
Employee類
private Integer id; private String name; private Integer age; private Integer sex; private Dept dept; //引用所屬的部門 private Set<Project> projects = new HashSet<>(); //保存項目引用
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>
延遲加載
當hibernate從數據庫中加載Dept對象時,如果同時加載所有關聯的Employee對象,而我們僅僅需要Dept對象,那么這些關聯的對象就白白浪費了許多內存空間,這時就有了延遲加載,如果實際需要用到Employee時再去加載。hibernate使用lazy屬性指定延遲加載的查詢策略
hibernate允許在對象-關系映射文件中配置加載策略
級別 | 說明 |
---|---|
類級別 | 元素中lazy屬性可選值為 true(延遲加載)和false(立即加載);默認值是true; |
一對多關聯級別 | 元素中lazy屬性的可選值為 :true(延遲加載) ,extra(增強延遲加載),false(立即加載) 默認值為 true |
多對一關聯級別 | 元素中lazy屬性的可選值為 :proxy(延遲加載),no-proxy(無代理延遲加載),和false(立即加載) ;默認值為 proxy |
以上就是深入淺析Hibernate中的關聯映射,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。