2009-05-27 53 views
3

考慮以下幾點:Hibernate/JPA Parent-Child - Parent equals()/ hashCode()可以使用數據庫ID嗎?

@Entity 
public class Parent implements Serializable { 
    @Id 
    private Long id; 
    // mapped ManyToOne below... 
    private List<Child> children = new ArrayList<Child>(); 

    ... 

} 

它是一個不好的做法,有Parent.equals()和Parent.hashCode()只使用ID?據我所知,Child.equals()和Child.hashCode()應該使用一組不變屬性作爲​​「自然鍵」,以便它們能夠由Parent正確管理。但是,如果Parent始終是頂級對象(即,它永遠不是任何關聯的反面),使用唯一標識符有什麼問題嗎?

是否有任何不必要的影響可以通過這樣做表現出來?我猜測,也許如果我這樣做,當我添加一個孩子(或刪除),Hibernate將無法告訴父已經改變(並需要在數據庫中更新)?在這種情況下,我應該使用Parent.equals()和Parent.hashCode()的children屬性嗎?

我問,因爲在Hibernate文檔明確地說,不使用@Id屬性「自然鍵」 ......

回答

5

的主要問題與使用ID作爲equals和hashCode基礎是非持久的對象。這些對象大概都是以相同的ID開始的,並且不能比較它們的平等性。即使你永遠不把這些對象放在一個集合中,如果它們通過API公開,並且其他人可以創建它們的實例並將它們放入一個集合中,那麼你已經打開了自己的一些討厭的錯誤。

+0

我明白你在說什麼,但是從技術上講,如果id是零,那麼他們確實是相等的:他們都是未被執行的父對象。對於只有這兩個屬性(id和children)的上述示例,您如何建議實現equals()和hashCode()?我需要引入更多的屬性嗎? – GreenieMeanie 2009-05-27 19:08:22

相關問題