Hibernate4.x之映射关系--双向1-n
雙向1-n與雙向n-1是完全相同的兩種情形
雙向1-n需要在1的一端可以訪問n的一端,反之亦然。
?
域模型:從Order到Customer的多對一雙向關聯需要在Order類中定義一個Customer屬性,而在Customer類中需定義存放Order對象的集合屬性
關系數據模型:ODDERS表中的CUSTOMER_ID參照CUSTOMER表的主鍵
?
當Session從數據庫中加載Java集合時,創建的是Hibernate內置集合類的實例,因此在持久化類中定義集合屬性時必須把屬性聲明為Java接口類型
-Hibernate的內置集合類具有集合代理功能,支持延遲檢索策略
-事實上,Hibernate的內置集合類封裝了JDK中的集合類,這使得Hibernate能夠對緩存中的集合對象進行臟檢查,按照集合對象的狀態來同步更新數據庫
在定義集合屬性時,通常把它初始化為集合實現類的一個實例。這樣可以提高程序的健壯性,避免應用程序訪問取值為null的集合的方法拋出NullPointException
?
Hibernate使用<set>元素來映射set類型的屬性。<set>節點中主要包括以下三個屬性:
<set>元素的inverse屬性
在Hibernate中通過inverse屬性的值來決定是由雙向關聯的哪一方來維護表和表之間的關系。inverse=false的為主動方,inverse=true的為被動方,由主動方負責維護關聯關系
在沒有設置inverse=true的情況下,父子兩邊都維護父子關系
在1-n關系中,將n方設為主控方將有助于性能改善
在1-N關系中,若將1方設為主控方
會額外多出update語句
插入數據時無法同時插入外鍵列,因為無法為外鍵列添加非空約束
<set>元素的cascade屬性
在對象-關系映射文件中,用于映射持久化類之間關聯關系的元素,<set>,<many-to-one>和<one-to-one>都有cascade屬性,它用于指定如何操縱與當前對象關聯的其他對象
delete:通過Session的delete方法刪除當前對象時,會級聯刪除所有關聯的對象
delete-orphan:刪除所有和當前對象解除關聯關系的對象
save-update:當通過Session的save,update及saveOrUpdate方法來保存或更新當前對象時,級聯保存所有關聯的新建的臨時對象,并且級聯更新所有關聯的游離對象
<set>元素的order-by屬性(在數據庫中對集合排序)
<set>元素有一個order-by屬性,如果設置了該屬性,當Hibernate通過select語句到數據庫中檢索集合對象時,利用order by子句進行排序
order-by屬性還可以加入SQL函數(DESC, ASC)
-------------------------------示例代碼-------------------------------------------------------------------------------------------------------------
Customer
1 package com.yl.hibernate.entities.n21.both; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class Customer { 7 8 private Integer customerId; 9 private String customerName; 10 /** 11 * 1.聲明集合類型時,需使用接口類型,因為hibernate在獲取集合類型時,返回的是Hibernate內置的集合類型,而不是JavaSE一個標準的集合 12 * 2.需要把集合進行初始化,可以防止發生空指針異常 13 */ 14 private Set<Order> orders = new HashSet<Order>(); 15 16 public Integer getCustomerId() { 17 return customerId; 18 } 19 public void setCustomerId(Integer customerId) { 20 this.customerId = customerId; 21 } 22 public String getCustomerName() { 23 return customerName; 24 } 25 public void setCustomerName(String customerName) { 26 this.customerName = customerName; 27 } 28 public Set<Order> getOrders() { 29 return orders; 30 } 31 public void setOrders(Set<Order> orders) { 32 this.orders = orders; 33 } 34 35 36 }Order
1 package com.yl.hibernate.entities.n21.both; 2 3 public class Order { 4 5 private Integer orderId; 6 private String orderName; 7 8 private Customer customer; 9 10 public Integer getOrderId() { 11 return orderId; 12 } 13 14 public void setOrderId(Integer orderId) { 15 this.orderId = orderId; 16 } 17 18 public String getOrderName() { 19 return orderName; 20 } 21 22 public void setOrderName(String orderName) { 23 this.orderName = orderName; 24 } 25 26 public Customer getCustomer() { 27 return customer; 28 } 29 30 public void setCustomer(Customer customer) { 31 this.customer = customer; 32 } 33 34 35 }Customer.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.entities.n21.both.Customer" table="CUSTOMERS"> 7 <id name="customerId" type="java.lang.Integer"> 8 <column name="CUSTOMER_ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="customerName" type="java.lang.String"> 12 <column name="CUSTOMER_NAME" /> 13 </property> 14 15 <!-- 映射1對多的那個集合屬性 --> 16 <!-- set: 映射set類型的屬性,table:set中的元素對應的記錄放在哪一個數據表中,該值需要和多對一的多的那個表的名字一致 --> 17 <!-- inverse:指定由哪一方來維護映射關系。通常設置為true,以指定由多的一方來維護關聯關系 --> 18 <!-- cascade:設定級聯操作。 開發時不建議設定該屬性。建議使用手工的方式來處理 19 delete 20 delete-orphan 21 save-update 22 --> 23 <!-- order-by 在查詢時對集合中的元素排序,order-by中使用的是表的字段名,而不是持久化類的屬性名 --> 24 <set name="orders" table="ORDERS" inverse="true" cascade="delete-orphan" order-by="ORDER_NAME DESC"> 25 <!-- key:指定多的表匯總的外鍵列的名字 --> 26 <key column="CUSTOMER_ID"></key> 27 <!-- 指定映射類型 --> 28 <one-to-many class="com.yl.hibernate.entities.n21.both.Order"/> 29 </set> 30 </class> 31 </hibernate-mapping>Order.hbm.xml
1 <?xml version="1.0"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 4 <!-- Generated 2014-11-26 19:19:40 by Hibernate Tools 3.4.0.CR1 --> 5 <hibernate-mapping> 6 <class name="com.yl.hibernate.entities.n21.both.Order" table="ORDERS"> 7 <id name="orderId" type="java.lang.Integer"> 8 <column name="ORDER_ID" /> 9 <generator class="native" /> 10 </id> 11 <property name="orderName" type="java.lang.String"> 12 <column name="ORDER_NAME" /> 13 </property> 14 <!-- 映射多對一的映射關系。使用many-to-one 來映射多對一的關聯關系 15 name:多這一端關聯的一那一端的屬性的名字 16 class:一那一端的屬性對應的類名 17 column:一那一端在多的一端對應的數據表中的外鍵的名字 18 --> 19 <many-to-one name="customer" class="com.yl.hibernate.entities.n21.both.Customer" column="CUSTOMER_ID"> 20 </many-to-one> 21 22 </class> 23 </hibernate-mapping>?
轉載于:https://www.cnblogs.com/dreamfree/p/4127218.html
總結
以上是生活随笔為你收集整理的Hibernate4.x之映射关系--双向1-n的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux路由表命令
- 下一篇: Linux安装技巧--安装Uuntu与w