日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Hibernate實體的equals和hashcode

 moonboat 2009-02-16
討論引發(fā)自這里:
http://www./topic/8946

以下是我自己的感觸。
equals實際上是java判斷兩個對象是否相等的一個依據(jù);而在set、map這樣的存儲位置與hashcode的集合中, hashcode起著計算位置的作用,同時又要滿足一個約定:equals相等,則hashcode必然相等。

基于以上,hibernate實體的Entity也需要做出如下策略:
1)怎樣才是相等實體對象
2)在set、map這樣的跟hashcide有關(guān)的集合映射時,如何保證相等對象hashcode也相等。

可以看出關(guān)鍵還是如何決定兩個實體對象是否相等,至于hashcode其實根據(jù)equals去實現(xiàn)的。
許多人提出來用實體對象的id來判斷是否相等,這其實源于hibernate的持久對象管理機制。Hibernate利用id屬性來管理一類持久對象,對于session中的一類持久對象,id是唯一的,因此id用作某一類持久對象的標(biāo)識符是合適的。

那么否針對id判斷實體相等就是合理的策略了嗎?
關(guān)鍵還是看你怎樣才認(rèn)為實體對象是相等的,這個倒不能采取hibernate對id的特殊用法。
如果認(rèn)為業(yè)務(wù)屬性無所謂,只要id相等就相等,那就完全可以用id作為判斷相等的依據(jù)。
如果需要根據(jù)業(yè)務(wù)屬性來判定,那么id就不是合理的策略,因為很可能id不等但是業(yè)務(wù)屬性都相等。
如果不是那么關(guān)心重復(fù)的實體對象,因此就不會覆蓋equals和hashcode方法,直接沿用Object的也是可以的,實際上很多時候我們都是這樣做的。
經(jīng)過仔細(xì)的思考,發(fā)現(xiàn)這種提出這種討論本身都是夸大了問題。equals和hashcode根本不是hibernate提出的新概念和新要求。

針對以上的分析,有沒有最佳實踐呢?
看看Hibernate in action,有三種方法:
1. 就是的這種用無意義主鍵id做hashCode/equals
2. 就是用的所有值做hashCode/equals
3. 用一個(或者幾個)相對穩(wěn)定的業(yè)務(wù)字段做hashCode/equals (比如user, 就用userName).
hibernate 推薦的是第3種, 按照這種推薦的做法, 就不會出現(xiàn)以上說的所有問題了, 這差不多是最佳的實踐了.

當(dāng)然如果不知道如何依據(jù)業(yè)務(wù)屬性來做相等判斷時,只要這樣:
在BaseEntity中,根據(jù)id來覆寫equals和hashcode
有特別需要的子類中,根據(jù)業(yè)務(wù)屬性來做equals和hashcode

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多