2009-05-27 138 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

相关问题