2016-08-23 57 views

回答

0

絕對沒有理由重寫equalshashCode,因爲Hibernate不依賴它們。它通過比較屬性來比較實體本身。

+0

Hibernate文檔聲明,否則,如果實體將放入使用這些方法的集合中,並且您計劃重新附加分離的實例,則應該實現equals()和hashCode()。 –

1

的Hibernate文檔:

你必須重載equals()和hashCode()方法,如果你

想把持久類的實例放入Set中(當 推薦的方式來表示許多-valued協會)和

打算使用分離的情況下

的復位

Hibernate保證持久identit的等價y(數據庫行) 以及僅在特定會話範圍內的Java標識。所以儘快 當我們混合在不同會話中檢索到的實例時,如果我們希望 集具有有意義的語義,我們必須實現 equals()和hashCode()。

看到此鏈接https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html

讓我們考慮這種情況下表現出一定的那會,如果你正在使用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) 
     } 
相關問題