91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入淺析Hibernate中的關聯映射

發布時間:2020-11-10 17:18:14 來源:億速云 閱讀:168 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關深入淺析Hibernate中的關聯映射,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

Hibernate中的關聯映射

關聯關系

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

從Employee到Dept的關聯就是 多對一 關聯。 這就說明 每個Employee對象只會引用一個Dept對象,因此在Employee類中應該定義一個Dept類型的屬性,來引用所關聯的Dept對象。

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

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

單向關聯

深入淺析Hibernate中的關聯映射

雙向關聯

深入淺析Hibernate中的關聯映射

配置多對一的關聯關系

  1. 以員工和部門為例,配置 員工到部門的單向多對一關聯
  2. 在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>
  1. name :屬性名 這里就是 Employee中的dept
  2. column:外鍵字段 ,這里就是Employee表里的dept字段
  3. class :dept屬性對應的類型 ,這里是 Dept類
  4. cascade:級聯操作 這里是 保存和修改
     

配置一對多的關聯關系

以員工和部門為例 ,從部門到員工的關聯就是 一對多的關聯

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

修改類屬性

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>
  1. name :屬性名 ,集合屬性的名字
  2. key元素:column 屬性 設定與所關聯的持久化類對應的表的外鍵,這里是employee表的dept外鍵字段名
  3. one-to-many :class屬性指定關聯的持久化類 這里對應的是員工類

cascade 屬性 關聯操作

用于指定如何操作與當前對象關聯的其他對象

可選值:

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

inverse屬性 反轉屬性

在hibernate中,'inverse'屬性指定了關聯關系中的方向。

關聯關系中,'inverse=”false”‘的為主動方,由主動方負責維護關聯關系。

order-by屬性 指定集合內元素的排序順序

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

order-by="age desc"

多對多關聯

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

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

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

Project類

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

配置Project映射類

<&#63;xml version="1.0" encoding="UTF-8"&#63;>
<!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屬性 對應第三張關聯表
  2. key元素的column屬性 對應project表在第三張表的外鍵
  3. many-to-many 元素 column對應關聯對象在第三張表的外鍵
     

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中的關聯映射,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鄂托克旗| 九台市| 顺昌县| 澄城县| 广南县| 寻乌县| 英吉沙县| 余江县| 谢通门县| 响水县| 呼图壁县| 手机| 微山县| 普格县| 江华| 晋中市| 齐齐哈尔市| 丹寨县| 雷山县| 普兰县| 华池县| 彝良县| 文成县| 富川| 辉县市| 巢湖市| 平罗县| 阳江市| 池州市| 平南县| 苏尼特右旗| 虎林市| 西安市| 高台县| 望城县| 云龙县| 射洪县| 安泽县| 大冶市| 临城县| 榆社县|