日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
正確理解HibernateInverse

通過(guò)Hibernate Inverse的設(shè)置來(lái)決定是由誰(shuí)來(lái)維護(hù)表和表之間的關(guān)系。最近有朋友問(wèn)我Hibernate關(guān)于多對(duì)多關(guān)于刪除中間表數(shù)據(jù)的問(wèn)題,關(guān)鍵是Inverse的設(shè)置,下面引用網(wǎng)友的一篇文章。

創(chuàng)新互聯(lián)公司-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比墊江網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式墊江網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋墊江地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。

Inverse是Hibernate雙向關(guān)系中的基本概念,當(dāng)然對(duì)于多數(shù)實(shí)體,我們并不需要雙向關(guān)聯(lián),更多的可能會(huì)選擇單向關(guān)聯(lián),況且我們大多數(shù)人 一般采用一對(duì)多關(guān)系,而一對(duì)多雙向關(guān)聯(lián)的另一端:多對(duì)一的Inverse屬性是不存在,其實(shí)它默認(rèn)就是Inverse=false.從而防止了在一對(duì)多端 胡亂設(shè)置Inverse也不至于出錯(cuò)。但是Inverse設(shè)置不當(dāng)確實(shí)會(huì)帶來(lái)很大的性能影響,這點(diǎn)是我們必須關(guān)注的。

這篇文章已經(jīng)詳細(xì)分析了Hibernate Inverse設(shè)置不當(dāng)帶來(lái)的影響:http://www.Hibernate.org/155.html,看了這篇文章,還是很有必要再寫(xiě)下一些總結(jié)的:

1)Hibernate Inverse中提及的side其實(shí)是指一個(gè)類(lèi)或者表的概念,雙向關(guān)聯(lián)其實(shí)是指雙方都可以取得對(duì)方的應(yīng)用。

2)維護(hù)關(guān)系這個(gè)名詞還是稍顯模糊或者晦澀。我們一般說(shuō)A類(lèi)或者A表(這里的表的是指多對(duì)多的連接表)有責(zé)任維護(hù)關(guān)系,其實(shí)這里的意思是說(shuō),我在應(yīng) 用在更新,創(chuàng)建,刪除(讀就不用說(shuō)了,雙向引用正是為了方便讀而出現(xiàn))A類(lèi)或者A表時(shí),此時(shí)創(chuàng)建的SQL語(yǔ)句必須有責(zé)任保證關(guān)系的正確修改。

3)Inverse=false的side(side其實(shí)是指Inverse=false所位于的class元素)端有責(zé)任維護(hù)關(guān)系,而Inverse=true端無(wú)須維護(hù)這些關(guān)系。

4)我們說(shuō)Hibernate Inverse設(shè)立不當(dāng)會(huì)導(dǎo)致性能低下,其實(shí)是說(shuō)Inverse設(shè)立不當(dāng),會(huì)產(chǎn)生多余重復(fù)的SQL語(yǔ)句甚至致使JDBC exception的throw。這是我們?cè)诮?shí)體類(lèi)關(guān)系時(shí)必須需要關(guān)注的地方。一般來(lái)說(shuō),Inverse=true是推薦使用,雙向關(guān)聯(lián)中雙方都設(shè)置 Inverse=false的話,必會(huì)導(dǎo)致雙方都重復(fù)更新同一個(gè)關(guān)系。但是如果雙方都設(shè)立Inverse=true的話,雙方都不維護(hù)關(guān)系的更新,這也是 不行的,好在一對(duì)多中的一端:many-to-one默認(rèn)是Inverse=false,避免了這種錯(cuò)誤的產(chǎn)生。但是多對(duì)多就沒(méi)有這個(gè)默認(rèn)設(shè)置了,所以很 多人經(jīng)常在多對(duì)多的兩端都使用Inverse=true,結(jié)果導(dǎo)致連接表的數(shù)據(jù)根本沒(méi)有記錄,就是因?yàn)樗麄冸p分都沒(méi)有責(zé)任維護(hù)關(guān)系。所以說(shuō),雙向關(guān)聯(lián)中***的設(shè)置是一端為Inverse=true,一端為Inverse=false。一般Inverse=false會(huì)放在多的一端,那么有人提問(wèn)了, many-to-many兩邊都是多的,Inverse到底放在哪兒?其實(shí)Hibernate建立多對(duì)多關(guān)系也是將他們分離成兩個(gè)一對(duì)多關(guān)系,中間連接一 個(gè)連接表。所以通用存在一對(duì)多的關(guān)系,也可以這樣說(shuō):一對(duì)多是多對(duì)多的基本組成部分。

看下面的多對(duì)多的定義大家更會(huì)清楚”多對(duì)多“與“一對(duì)多”的關(guān)系:其中我們注意標(biāo)簽的特點(diǎn)就知道,它是定義了一個(gè)多對(duì)多關(guān)系,而不是。

 
 
 
  1.    
  2. "-//Hibernate/Hibernate Mapping DTD 2.0//EN"   
  3. "http://Hibernate.sourceforge.net/Hibernate-mapping-2.0.dtd">   
  4.    
  5. dynamic-update="true" dynamic-insert="true" >  
  6.       
  7.        
  8.        
  9.      
  10.    
  11.     update="true" insert="true" column="name" />  
  12.       
  13.        
  14.        
  15.      
  16.    
  17. dynamic-update="true" dynamic-insert="true" >  
  18.       
  19.        
  20.        
  21.      
  22.  
  23.    
  24.    insert="true" column="name" />  
  25.  
  26.       
  27.        
  28.        
  29.      
  30.    
  31.  

在對(duì)多對(duì)中,因?yàn)橐欢司S護(hù)關(guān)系另一端不維護(hù)關(guān)系的原因,我們必須注意避免在應(yīng)用中用不維護(hù)關(guān)系的類(lèi)建立關(guān)系,因?yàn)檫@樣建立的關(guān)系是不會(huì)在數(shù)據(jù)庫(kù)中存儲(chǔ)的。基于上面的映射文件代碼給出一個(gè)例子:

 
 
 
  1. package org.Hibernate.auction;   
  2. import java.util.*;  
  3. /**   
  4. * @author Administrator   
  5.  
  6. * To change the template for this generated type comment go to   
  7. * Window>Preferences>Java>Code Generation>Code and Comments   
  8. */   
  9. public class TestA {   
  10. int id;   
  11. String name;   
  12. Set testBs=new HashSet();   
  13. public TestA(){   
  14. }   
  15. public TestA(int id){   
  16.    setId(id);   
  17. }   
  18. public int getId(){   
  19.    return id;   
  20. }   
  21. public void setId(int id){   
  22.    this.id=id;   
  23. }   
  24. public String getName(){   
  25.    return name;   
  26. }   
  27. public void setName(String name){   
  28.    this.name=name;   
  29. }   
  30. public Set getTestBs(){   
  31.    return testBs;   
  32. }   
  33. public void setTestBs(Set s){   
  34.    testBs=s;   
  35. }   
  36. public void addTestB(TestB tb){   
  37.    testBs.add(tb);   
  38. }public static void main(String[] args) {   
  39. }   
  40. }  
  41. public class TestB {  
  42. int id;   
  43. String name;   
  44. Set testAs=new HashSet();   
  45. public TestB(){   
  46. }   
  47. public TestB(int id){   
  48.    setId(id);   
  49. }   
  50. public int getId(){   
  51.    return id;   
  52. }   
  53. public void setId(int id){   
  54.    this.id=id;   
  55. }   
  56. public String getName(){   
  57.    return name;   
  58. }   
  59. public void setName(String name){   
  60.    this.name=name;   
  61. }   
  62. public Set getTestAs(){   
  63.    return testAs;   
  64. }   
  65. public void setTestAs(Set s){   
  66.    testAs=s;   
  67. }   
  68. public void addTestA(TestA ta){   
  69.    testAs.add(ta);   
  70. }   
  71. public static void main(String[] args) {   
  72. }   

測(cè)試代碼:

 
 
 
  1. public void doTest() throws Exception{   
  2.    TestA a1=new TestA(1);   
  3.    TestA a2=new TestA(2);   
  4.    TestA a3=new TestA(3);   
  5.    TestB b1=new TestB(1);   
  6.    TestB b2=new TestB(2);   
  7.    TestB b3=new TestB(3);   
  8.    a1.addTestB(b1);   
  9.    a1.addTestB(b2);   
  10.    a1.addTestB(b3);   
  11.    b2.addTestA(a1);   
  12.    b2.addTestA(a2);   
  13.    Session s = factory.openSession();   
  14.    s = factory.openSession();   
  15.    Session session = factory.openSession();   
  16. session.save(a1);   
  17. session.flush();   
  18. session.close();  

測(cè)試后連接表的數(shù)據(jù)為:

testa              testb

1                  1

1                  2

1                  3

根據(jù)Inverse規(guī)則,對(duì)這些代碼:b2.addTestA(a1);   b2.addTestA(a2); 建立的關(guān)系,數(shù)據(jù)庫(kù)并沒(méi)有存儲(chǔ)下來(lái),因?yàn)門(mén)estB沒(méi)有責(zé)任維護(hù)這些關(guān)系,所以產(chǎn)生的sql語(yǔ)句自然不會(huì)有針對(duì)Testa_testB表的操作了。假設(shè)應(yīng) 用中真的需要這些方法,那么我們可以修改TestB的方法,讓他們注意在維護(hù)端類(lèi)中執(zhí)行相應(yīng)的操作以使得關(guān)系能夠在數(shù)據(jù)庫(kù)中保存下來(lái),更改TestB如 下:

 
 
 
  1. /*   
  2. * Created on 2004-7-25   
  3.  
  4. * To change the template for this generated file go to   
  5. * Window>Preferences>Java>Code Generation>Code and Comments   
  6. */   
  7. package org.Hibernate.auction;   
  8. import java.util.*;  
  9. /**   
  10. * @author Administrator   
  11.  
  12. * To change the template for this generated type comment go to   
  13. * Window>Preferences>Java>Code Generation>Code and Comments   
  14. */   
  15. public class TestB {  
  16. int id;   
  17. String name;   
  18. Set testAs=new HashSet();   
  19. public TestB(){   
  20. }   
  21. public TestB(int id){   
  22.    setId(id);   
  23. }   
  24. public int getId(){   
  25.    return id;   
  26. }   
  27. public void setId(int id){   
  28.    this.id=id;   
  29. }   
  30. public String getName(){   
  31.    return name;   
  32. }   
  33. public void setName(String name){   
  34.    this.name=name;   
  35. }   
  36. public Set getTestAs(){   
  37.    return testAs;   
  38. }   
  39. public void setTestAs(Set s){   
  40.    testAs=s;   
  41. }   
  42. public void addTestA(TestA ta){   
  43.    testAs.add(ta);   
  44.    ta.addTestB(this);   
  45. }   
  46. public static void main(String[] args) {   
  47. }   
  48. }  

那么測(cè)試執(zhí)行后連接表的數(shù)據(jù)為:

testa          testb

1               2

1               3

1               1

2               2

測(cè)試通過(guò)。

【編輯推薦】

  1. 強(qiáng)人Hibernate文檔筆記(上)
  2. 強(qiáng)人Hibernate文檔筆記(中)
  3. 強(qiáng)人Hibernate文檔筆記(下)
  4. Hibernate一對(duì)多關(guān)系的處理
  5. Hibernate的性能優(yōu)化

當(dāng)前名稱:正確理解HibernateInverse
網(wǎng)址分享:http://www.dlmjj.cn/article/dhdscse.html