爲什麼在Hibernate持久化類中覆蓋hashCode()
和equals()
方法被認爲是最佳實踐?爲什麼要重寫hashCode並等於hibernate持久化類中的方法?
0
A
回答
0
絕對沒有理由重寫equals
和hashCode
,因爲Hibernate
不依賴它們。它通過比較屬性來比較實體本身。
+0
Hibernate文檔聲明,否則,如果實體將放入使用這些方法的集合中,並且您計劃重新附加分離的實例,則應該實現equals()和hashCode()。 –
1
的Hibernate文檔:
你必須重載equals()和hashCode()方法,如果你
想把持久類的實例放入Set中(當 推薦的方式來表示許多-valued協會)和
打算使用分離的情況下
的復位Hibernate保證持久identit的等價y(數據庫行) 以及僅在特定會話範圍內的Java標識。所以儘快 當我們混合在不同會話中檢索到的實例時,如果我們希望 集具有有意義的語義,我們必須實現 equals()和hashCode()。
讓我們考慮這種情況下表現出一定的那會,如果你正在使用equals和hashCode的缺省實現發生的問題:
@Entity Parent{
@Id
@GeneratedValue
Long id;
@OneToMany(mappedBy = "parent",
cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name="PARENT_ID")
Set<Child> childrens = new HashSet<Child>();
//get+set
}
@Entity Child{
@Id
@GeneratedValue
Long id;
}
test(){
Parent p1 = new Parent();
Child c1 = new Child();
entityManager.persist(p1);
entityManager.persist(c1);
p1.getChilds.add(c1);
entityManager.merge(p);
//!!:using another instance of entitymanager just to simulate the case of detached entities.
Parent p2 =entityManager1.find(p1.getId(),Parent.class);
child c2 =entityManager1.find(c1.getId(),Child.class);
boolean contains=p1.getChilds().contains(c2); // problem1: contains==false
//Then if we add c2 to the childs set we will have
//a duplication inside the Set
p2.getChilds.add(c2);//problem2:childs contains c1 and c2
boolean remove=p2.getChilds.remove(c2);//problem3:remove==false
entityManager1.merge(p2);//problem4: hibernate will deal with c2
//like a new entity then an insert operation is
//triggered on c2 (an exception=> violation of unique id)
}
相關問題
- 1. 我是否需要重寫hashCode並使用compareTo方法等於方法?
- 2. 重寫hashCode方法在類
- 3. Hibernate:在持久集合中重用持久化類
- 4. 什麼時候需要重寫equals和hashcode方法?
- 5. 重寫的hashCode()方法
- 6. 重寫的hashCode equals方法
- 7. 面試之謎 - 爲什麼我們要重寫了hashCode和equals方法
- 8. 什麼是hibernate中的持久性?
- 9. 爲什麼JCA要求在ResourceAdapter和ManagedConnectionFactory bean上等於&hashCode?
- 10. 顯示java.lang.NullPointerException Hibernate的持久化類
- 11. 爲什麼即使我重寫hashCode()方法,containsValue方法返回true?
- 12. 爲什麼一些不重寫對象Java API類等於/ toString方法
- 13. Hibernate類設計,持久化List和HashMap
- 14. 在java中重寫hashcode和equals方法?
- 15. 什麼是需要重寫String類中的equals方法?
- 16. 什麼是重寫equals()和hashCode()的POJO?
- 17. 重寫HashMap等於Java中的方法
- 18. Hibernate持久化ArrayList - 問題
- 19. Hibernate持久化訂單
- 20. 使用Hibernate持久化java.util.Properties?
- 21. 重寫的hashCode()和equals()方法
- 22. 爲什麼我們要使用抽象類或方法,爲什麼不重寫超類方法呢?
- 23. java中的哪些類正在重寫equals()和hashCode()方法?
- 24. 重寫hashCode()方法不允許保存Neo4J中的類屬性
- 25. Hashcode方法,等於在Java合同
- 26. 爲什麼要重寫Java中的克隆方法
- 27. 並用SpringMVC Hibernate持久
- 28. HashSet的等於,是的hashCode重寫,STYL有重複
- 29. 在Java中重寫hashCode()時應該重寫'equals'(Object)方法嗎?
- 30. 獨特的方法不適用於帶重寫的類等於
請提供參考誰說這是最佳做法。 – chrylis