日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Hibernate的集合映射

POJOs如下:

Customer類---->customer表

Order類對(duì)應(yīng)---->orders表

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

 
 
 
 
  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 orders = new HashSet();  
  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集合映射:

Hibernate為集合映射提供了專用的標(biāo)簽元素,Set集合映射,就使用標(biāo)簽表示:

 
 
 
 
  1.  
  2.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  3.       
  4.      
  5.          
  6.              
  7.              
  8.                  
  9.                  
  10.              
  11.               
  12.              
  13.              
  14.              
  15.              
  16.              
  17.               
  18.              
  19.                  
  20.                  
  21.              
  22.           
  23.          
  24.      

標(biāo)簽中的"name"屬性表示customer對(duì)象中關(guān)系集合的屬性名,"inverse"與"cascade"屬性說(shuō)明(參考這里)。在數(shù)據(jù)庫(kù)中表示"一對(duì)多"的關(guān)系是通過(guò)外鍵關(guān)聯(lián)的方式實(shí)現(xiàn)的,"多方"通過(guò)持有"一方"的主鍵值來(lái)確定關(guān)系,怎么持有"一方"的主鍵值?"多方"將使用一列來(lái)存儲(chǔ)"一方"的主鍵值,然后將此列作為外鍵列參照"一方"的主鍵列。所以使用Hibernate開(kāi)發(fā)時(shí)需要將兩表的關(guān)系列(外鍵列)告訴Hibernate,就是完成這個(gè)工作的,Hibernate就能根據(jù) "customer_id"列取出關(guān)聯(lián)信息。例如:從customer表中取出一條記錄后,Hibernate會(huì)根據(jù)該customer記錄的主鍵值再?gòu)膐rder表中查找"custom_id"列,取出值相等的記錄,然后組裝到Customer對(duì)象中的set集合屬性中,反之亦然。因?yàn)槿〕鰜?lái)的記錄(只是一些零碎的值,還沒(méi)有組裝成對(duì)象)需要存放到Set集合中,所以要告訴Hibernate在Set集合里面能放什么類型的數(shù)據(jù)。這個(gè)標(biāo)簽就是完成這個(gè)工作的,"class"屬性是指定這個(gè)這個(gè)Set集合里面元素的類型。

 
 
 
 
  1.  
  2.     "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
  3.       
  4.      
  5.          
  6.              
  7.                  
  8.                  
  9.              
  10.               
  11.              
  12.              
  13.               
  14.              
  15.                  
  16.                       
  17.          
  18.      

標(biāo)簽是設(shè)置"一對(duì)多"關(guān)系中的"多方"的,name指定了哪一個(gè)屬性是關(guān)系屬性,"class"指定了關(guān)系屬性的類型(也指定了與哪一個(gè)表關(guān)聯(lián)), "column"屬性是指定這個(gè)關(guān)聯(lián)屬性是按照"customer_id"列的值,在customer表中查詢獲得的。

測(cè)試:

 
 
 
 
  1. tx = session.beginTransaction();  
  2.  
  3. /*  
  4.  * 創(chuàng)建Customer對(duì)象,并設(shè)置其屬性值  
  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.  * 創(chuàng)建Order對(duì)象order1,并設(shè)置其屬性值  
  14.  */ 
  15. Order order1 = new Order();  
  16. order1.setOrderNumber("a1a2a3");  
  17. order1.setBalance(1000);  
  18. order1.setCustomer(customer);  
  19.  
  20. /*  
  21.  * 創(chuàng)建Order對(duì)象order2,并設(shè)置其屬性值  
  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(); 

查看數(shù)據(jù)庫(kù)的數(shù)據(jù):

customer表:

orders表 

可以看到數(shù)據(jù)被成功的插入到數(shù)據(jù)庫(kù)中了,并且"custom_id"列(關(guān)系列)也正確賦值了。

List映射:

Hibernate為集合映射提供了專用的標(biāo)簽元素,List集合映射,就使用標(biāo)簽表示:

 
 
 
 
  1.  
  2.      
  3.      
  4.      
  5.  

List集合是有順序的,"index"標(biāo)簽,是用于記錄順序,List的順序?qū)⒈憩F(xiàn)在"customer_index"列上,其余設(shè)置,與Set集合類似。注意:List映射中"inverse"中的值不能設(shè)置為"true",因?yàn)長(zhǎng)ist集合的順序只有customer方知道,order方不知道List的存在。不然,"customer_index"的列值將不會(huì)被賦值。

查看數(shù)據(jù)庫(kù):

customer表:

orders表:

可以看到記錄正確的插入到數(shù)據(jù)庫(kù)中了,而且"custom_index"正確的表示出List的順序。

Array(數(shù)組)映射:標(biāo)簽使用其他與List基本一致。

Map映射:

Hibernate為集合映射提供了專用的標(biāo)簽元素,Map集合映射,就使用標(biāo)簽表示:

 
 
 
 
  1.  
  2.      
  3.      
  4.      
  5.  

Map映射中標(biāo)簽,表示Map集合中的key值,記錄在"order_key"列中,表示Map集合中的vlaue。其他設(shè)置與上面一樣。注意:"inverse"不要設(shè)置成"true"因?yàn)閗ey值是customer對(duì)象維護(hù)的,而order不知道key的存在。

Bag映射:它是List與Set集合的結(jié)合,可以重復(fù),但是無(wú)順。使用List模擬Bag。設(shè)置類似Set,它也有專用標(biāo)簽。

總  結(jié)

在沒(méi)有特殊要求下,***使用Set集合,因?yàn)镾et集合沒(méi)有特殊信息需要"一方"自己維護(hù),可以完全交給"多方"維護(hù),能夠提高性能,若需要記錄數(shù)據(jù)的順序可以使用List和Array映射,若需要key/value形式存儲(chǔ)數(shù)據(jù),可以使用Map映射。***一點(diǎn)若集合放置的數(shù)據(jù)簡(jiǎn)單類型(原生類型、原生類型的包裝類、String、Date之類的)在集合映射配置上稍有不同,元素可以直接映射這些簡(jiǎn)單類型,其他配置與上述配置沒(méi)什么不同。


新聞標(biāo)題:Hibernate的集合映射
當(dāng)前網(wǎng)址:http://www.5511xx.com/article/codhihg.html