hibernate集合映射(轉載)

POJOs以下:html

Customer類---->customer表數據庫

Order類對應---->orders表數組

customer(1)<----->(n)ordersession

 
  1. public class Customer  
  2. {  
  3.     private String id;  
  4.     private String username;  
  5.     private String password;  
  6.     private Timestamp registerTime;  
  7.     private int age;  
  8.     private Set<Order> orders = new HashSet<Order>();  
  9.  
  10.     /*setter and getter method*/ 
 
  1. public class Order  
  2. {  
  3.     private String id;  
  4.     private String orderNumber;  
  5.     private int balance;  
  6.     private Customer customer;  
  7.  
  8.     /*setter and getter method*/ 

Set集合映射:app

Hibernate爲集合映射提供了專用的標籤元素,Set集合映射,就使用<set>標籤表示:性能

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4.       
  5.     <hibernate-mapping> 
  6.         <class name="com.suxiaolei.hibernate.pojos.Customer" table="customer"> 
  7.             <!-- 主鍵設置 --> 
  8.             <id name="id" type="string"> 
  9.                 <column name="id"></column> 
  10.                 <generator class="uuid"></generator> 
  11.             </id> 
  12.               
  13.             <!-- 屬性設置 --> 
  14.             <property name="username" column="username" type="string"></property> 
  15.             <property name="password" column="password" type="string"></property> 
  16.             <property name="age" column="age" type="integer"></property> 
  17.             <property name="registerTime" column="register_time" type="timestamp"></property> 
  18.               
  19.             <set name="orders" inverse="true" cascade="all"> 
  20.                 <key column="customer_id"></key> 
  21.                 <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/> 
  22.             </set> 
  23.           
  24.         </class> 
  25.     </hibernate-mapping> 

<set>標籤中的"name"屬性表示customer對象中關係集合的屬性名,"inverse"與"cascade"屬性說明 (參考這裏)。在數據庫中表示"一對多"的關係是經過外鍵關聯的方式實現的,"多方"經過持有"一方"的主鍵值來肯定關係,怎麼持有"一方"的主鍵值?" 多方"將使用一列來存儲"一方"的主鍵值,而後將此列做爲外鍵列參照"一方"的主鍵列。因此使用Hibernate開發時須要將兩表的關係列(外鍵列)告 訴Hibernate,<key column="customer_id"></key>就是完成這個工做的,Hibernate就能根據 "customer_id"列取出關聯信息。例如:從customer表中取出一條記錄後,Hibernate會根據該customer記錄的主鍵值再從 order表中查找"custom_id"列,取出值相等的記錄,而後組裝到Customer對象中的set集合屬性中,反之亦然。由於取出來的記錄(只 是一些零碎的值,尚未組裝成對象)須要存放到Set集合中,因此要告訴Hibernate在Set集合裏面能放什麼類型的數據。<one-to- many>這個標籤就是完成這個工做的,"class"屬性是指定這個這個Set集合裏面元素的類型。測試

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  4.       
  5.     <hibernate-mapping> 
  6.         <class name="com.suxiaolei.hibernate.pojos.Order" table="orders"> 
  7.             <id name="id" type="string"> 
  8.                 <column name="id"></column> 
  9.                 <generator class="uuid"></generator> 
  10.             </id> 
  11.               
  12.             <property name="orderNumber" column="orderNumber" type="string"></property> 
  13.             <property name="balance" column="balance" type="integer"></property> 
  14.               
  15.             <many-to-one name="customer" class="com.suxiaolei.hibernate.pojos.Customer"> 
  16.                 <column name="customer_id"></column> 
  17.             </many-to-one>          
  18.         </class> 
  19.     </hibernate-mapping> 

<many-to-one>標籤是設置"一對多"關係中的"多方"的,name指定了哪個屬性是關係屬性,"class"指定了關係 屬性的類型(也指定了與哪個表關聯), "column"屬性是指定這個關聯屬性是按照"customer_id"列的值,在customer表中查詢得到的。ui

測試:.net

 
  1. tx = session.beginTransaction();  
  2.  
  3. /*  
  4.  * 建立Customer對象,並設置其屬性值  
  5.  */ 
  6. Customer customer = new Customer();  
  7. customer.setUsername("zhangsan");  
  8. customer.setPassword("123456");  
  9. customer.setAge(22);  
  10. customer.setRegisterTime(new Timestamp(new Date().getTime()));  
  11.  
  12. /*  
  13.  * 建立Order對象order1,並設置其屬性值  
  14.  */ 
  15. Order order1 = new Order();  
  16. order1.setOrderNumber("a1a2a3");  
  17. order1.setBalance(1000);  
  18. order1.setCustomer(customer);  
  19.  
  20. /*  
  21.  * 建立Order對象order2,並設置其屬性值  
  22.  */ 
  23. Order order2 = new Order();  
  24. order2.setOrderNumber("d3d2d1");  
  25. order2.setBalance(670);  
  26. order2.setCustomer(customer);  
  27.  
  28. customer.getOrders().add(order1);  
  29. customer.getOrders().add(order2);  
  30.  
  31. session.saveOrUpdate(customer);  
  32.  
  33. tx.commit(); 

查看數據庫的數據:hibernate

customer表:

orders表 

能夠看到數據被成功的插入到數據庫中了,而且"custom_id"列(關係列)也正確賦值了。

List映射:

Hibernate爲集合映射提供了專用的標籤元素,List集合映射,就使用<list>標籤表示:

 
  1. <list name="orders" inverse="false" cascade="all"> 
  2.     <key column="customer_id"></key> 
  3.     <index column="customer_index" type="integer"></index> 
  4.     <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/> 
  5. </list> 

List集合是有順序的,"index"標籤,是用於記錄順序,List的順序將表如今"customer_index"列上,其他設置,與Set 集合相似。注意:List映射中"inverse"中的值不能設置爲"true",由於List集合的順序只有customer方知道,order方不知 道List的存在。否則,"customer_index"的列值將不會被賦值。

查看數據庫:

customer表:

orders表:

能夠看到記錄正確的插入到數據庫中了,並且"custom_index"正確的表示出List的順序。

Array(數組)映射:標籤使用<array>其餘與List基本一致。

Map映射:

Hibernate爲集合映射提供了專用的標籤元素,Map集合映射,就使用<map>標籤表示:

 
  1. <map name="orders" inverse="false" cascade="all"> 
  2.     <key column="customer_id"></key> 
  3.     <index column="order_key" type="string"></index> 
  4.     <one-to-many class="com.suxiaolei.hibernate.pojos.Order"/> 
  5. </map> 

Map映射中<index>標籤,表示Map集合中的key值,記錄在"order_key"列中,<one-to- many>表示Map集合中的vlaue。其餘設置與上面同樣。注意:"inverse"不要設置成"true"由於key值是customer對 象維護的,而order不知道key的存在。

Bag映射:它是List與Set集合的結合,能夠重複,可是無順。使用List模擬Bag。設置相似Set,它也有專用標籤<bag>。

總  結

在沒有特殊要求下,最好使用Set集合,由於Set集合沒有特殊信息須要"一方"本身維護,能夠徹底交給"多方"維護,可以提升性能,若須要記錄數 據的順序可使用List和Array映射,若須要key/value形式存儲數據,可使用Map映射。最後一點若集合放置的數據簡單類型(原生類型、 原生類型的包裝類、String、Date之類的)在集合映射配置上稍有不一樣,<element>元素能夠直接映射這些簡單類型,其餘配置與 上述配置沒什麼不一樣。

原文連接:http://www.cnblogs.com/otomedaybreak/archive/2012/01/18/2325993.html

相關文章
相關標籤/搜索