Hibernate映射解析之關聯(lián)映射詳解
Hibernate中的關聯(lián)映射
關聯(lián)關系
平時開發(fā)中,類與類之間最普遍的的關系就是關聯(lián)關系,而且關聯(lián)是有方向的。
以部門(Dept)和員工(Employee)為例:一個部門下有多個員工,而一個員工只能屬于一個部門。
從Employee到Dept的關聯(lián)就是 多對一 關聯(lián)。 這就說明 每個Employee對象只會引用一個Dept對象,因此在Employee類中應該定義一個Dept類型的屬性,來引用所關聯(lián)的Dept對象。
從Dept到Employee的關聯(lián)就是 一對多 關聯(lián)。這就說明 每個Dept對象會引用一組Employee對象,因此應該在Employee類中定義一個集合類型的屬性,來引用所有關聯(lián)的Employee對象。
如果僅有從Employee到Dept的關聯(lián)或者僅有從Dept到Employee的關聯(lián),就稱為單向關聯(lián)。
如果同時包含兩種關聯(lián),就是雙向關聯(lián)。
單向關聯(lián)

雙向關聯(lián)

配置多對一的關聯(lián)關系
- 以員工和部門為例,配置 員工到部門的單向多對一關聯(lián)
- 在Employee類中定義Dept類型的屬性 dept;
配置文件中配置 使用'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>
- name :屬性名 這里就是 Employee中的dept
- column:外鍵字段 ,這里就是Employee表里的dept字段
- class :dept屬性對應的類型 ,這里是 Dept類
- cascade:級聯(lián)操作 這里是 保存和修改
配置一對多的關聯(lián)關系
以員工和部門為例 ,從部門到員工的關聯(lián)就是 一對多的關聯(lián)
- 在Dept類中增加集合屬性用來保存所引用的員工對象
- 在映射文件中配置 set
修改類屬性
private Integer id; private String name; private Set<Employee> employees = new HashSet<>(); //用來保存員工引用
修改映射文件
<!-- 配置一對多的關聯(lián) --> <set name="employees"> <!-- name 對應的屬性名 就是集合的名字 --> <key column="dept"></key> <!-- 對應的是 employee表的外鍵字段名 --> <one-to-many class="com.ytzl.demo.entity.Employee"/> <!-- 關聯(lián)的類 這里是 員工類 --> </set>
- name :屬性名 ,集合屬性的名字
- key元素:column 屬性 設定與所關聯(lián)的持久化類對應的表的外鍵,這里是employee表的dept外鍵字段名
- one-to-many :class屬性指定關聯(lián)的持久化類 這里對應的是員工類
cascade 屬性 關聯(lián)操作
用于指定如何操作與當前對象關聯(lián)的其他對象
可選值:
- none :默認值 ;不關聯(lián)其他的對象
- save-update 當通過Session執(zhí)行
save(),update()及saveOrUpdate()方法的時候級聯(lián)更新或者保存所關聯(lián)的對象 - delete :當通過
session的delete()刪除當前對象時,會級聯(lián) 刪除關聯(lián)對象; - all :包含 delete,save-update的行為
inverse屬性 反轉(zhuǎn)屬性
在hibernate中,'inverse'屬性指定了關聯(lián)關系中的方向。
關聯(lián)關系中,'inverse=”false”‘的為主動方,由主動方負責維護關聯(lián)關系。
order-by屬性 指定集合內(nèi)元素的排序順序
這里以員工和部門為例,部門內(nèi)的員工要以年齡倒序的順序排序,就可以通過設置 order-by屬性
order-by="age desc"
多對多關聯(lián)
以 員工和項目為例,一個員工可以參與到多個項目中,每個項目有多個員工的參于
- 配置 Project類 ,在類中添加集合屬性 用于保存員工引用
- 配置Employee類,在類中添加集合睡醒,用于保存項目引用
往往多對多映射涉及到第三張表
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屬性 對應第三張關聯(lián)表
- key元素的column屬性 對應project表在第三張表的外鍵
- many-to-many 元素 column對應關聯(lián)對象在第三張表的外鍵
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從數(shù)據(jù)庫中加載Dept對象時,如果同時加載所有關聯(lián)的Employee對象,而我們僅僅需要Dept對象,那么這些關聯(lián)的對象就白白浪費了許多內(nèi)存空間,這時就有了延遲加載,如果實際需要用到Employee時再去加載。hibernate使用lazy屬性指定延遲加載的查詢策略
hibernate允許在對象-關系映射文件中配置加載策略
| 級別 | 說明 |
|---|---|
| 類級別 | |
| 一對多關聯(lián)級別 | |
| 多對一關聯(lián)級別 |
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Spring?Boot?Shiro?auto-configure工作流程詳解
這篇文章主要為大家介紹了Spring?Boot?Shiro?auto-configure工作流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
一文解決pom.xml報錯Dependency "xxx" not f
我們在使用maven進行jar包管理時有時會遇到pom.xml中報錯Dependency “XXX” not found,所以在本文中將給大家介紹一下pom.xml報錯Dependency "xxx" not found的解決方案,需要的朋友可以參考下2024-01-01

