?

          使用 hibernate 快一年了,一直使用得比較膚淺,甚至沒有正式使用過對象關(guān)系。近段時(shí)間想深入研究一下,以便在項(xiàng)目中推廣,減少不必要的對象維護(hù)和編程。問題不期而遇,在多對多關(guān)系中,出現(xiàn)了遞規(guī)加載的現(xiàn)象,例如:用戶和角色的關(guān)系,一個(gè)用戶可能有多個(gè)角色,一個(gè)角色中包含多個(gè)用戶。我是通過帶有連接表的多對多關(guān)系實(shí)現(xiàn)的,用戶和角色對象中都維持了一個(gè) Set 對象,用以延遲加載關(guān)系。但是,在我延遲加載用戶擁有的角色時(shí),被加載的角色又加載它所包含的用戶,被加載的用戶又加載所擁有的角色,這樣遞規(guī)加載下去,由于 session 的關(guān)閉會拋出異常導(dǎo)致程序中止。開始百思不得其解,在仔細(xì)查看拋出的異常堆棧時(shí),終于發(fā)現(xiàn)了問題所在。習(xí)慣!錯(cuò)誤的習(xí)慣。我們所使用的持續(xù)層對象會繼承一個(gè)基礎(chǔ)類,該類“實(shí)現(xiàn)”了 hashCode equals 方法,代碼如下:

          public boolean equals(Object o) {

          ??? return EqualsBuilder.reflectionEquals(this, o);

          }

          public int hashCode() {

          return HashCodeBuilder.reflectionHashCode(this);

          }

          hibernate 將用戶所擁有的角色對象放進(jìn) Set 中,實(shí)際 Set 會調(diào)用 hashCode equals 來判斷兩個(gè)對象是否相等,這樣問題就來了, HashCodeBuilder.reflectionHashCode(this) 方法使用反射調(diào)用角色對象的 getUsers() 方法, hibernate 又加載角色所包含的用戶,能沒有問題嗎?繼而我們得反思一下持續(xù)層對象有沒有通用的 hashCode equals 方法。

          ?????? 參考《深入淺出 Hibernate 》對 hashCode equals 方法的處理有兩大種:

          1、? 不覆蓋

          問題:實(shí)體對象的跨 session 識別問題,根本在于 hashCode 默認(rèn)調(diào)用 System.identityHashCode() 方法。

          2、? 覆蓋

          ????????? 使用對象 pk

          問題:新增對象時(shí),沒有 pk ,那么所有的對象都相等了,也就是只能加入的一條。

          ????????? 值比對(對實(shí)體對象的所有屬性值進(jìn)行比對,可以使用 Commonclipse 自動(dòng)生成)

          問題:過于嚴(yán)格。

          ????????? 業(yè)務(wù)關(guān)鍵信息判定

          是值比對的一個(gè)子集,只做業(yè)務(wù)關(guān)鍵屬性的比對。

          個(gè)人覺得業(yè)務(wù)關(guān)鍵信息判定的方法比較合理,使用 Commonclipse 自動(dòng)生成值比對,注意兩點(diǎn):

          1、? 去掉實(shí)體關(guān)聯(lián)集合屬性的比對,不然又會出現(xiàn)我上述的“遞規(guī)加載”現(xiàn)象。

          2、? 自動(dòng)生成的 hashCode 方法去掉 appendSuper(super.hashCode()) ,自動(dòng)生成的 equals 方法去掉 appendSuper(super.equals(object)) ,不然你的對象比較和加入 collection 都有問題的,《深入淺出 Hibernate 》書中沒有強(qiáng)調(diào)。

          posted on 2007-01-13 19:13 野草 閱讀(789) 評論(1)  編輯  收藏 所屬分類: 2shtv

          評論:
          # re: 持續(xù)層對象的hashCode和equals方法 2008-01-13 22:40 | java綜合網(wǎng)
          java綜合網(wǎng)
          http://www.javazh.cn
          很好!不錯(cuò)!  回復(fù)  更多評論
            
          主站蜘蛛池模板: 岑巩县| 乐亭县| 揭东县| 鱼台县| 观塘区| 吉木萨尔县| 夹江县| 涟源市| 万安县| 阳城县| 阿拉尔市| 桑植县| 涟水县| 长宁县| 黑龙江省| 芒康县| 苏尼特左旗| 漳浦县| 泸西县| 伊金霍洛旗| 开远市| 屏东县| 霞浦县| 云安县| 松潘县| 册亨县| 汉源县| 蒙自县| 丰原市| 三原县| 策勒县| 枣强县| 阳高县| 阿克| 油尖旺区| 九龙坡区| 湖南省| 黑山县| 嘉黎县| 金寨县| 阿拉尔市|