假设有以下情况:
@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总是顶级对象(即它永远不是任何关联的反面),那么只使用id有什么错吗?
这样做有没有什么不必要的影响呢?我猜想如果我这样做,当我添加(或删除)一个子元素时,Hibernate将不能告诉你父元素已经改变(并且需要在数据库中更新)?在这种情况下,我是否应该为Parent.equals()和Parent.hashCode()使用子属性?
我之所以问这个问题,是因为Hibernate文档明确表示不要将@Id属性用于“自然键”……
发布于 2009-05-27 19:01:29
使用ID作为equals和hashCode基础的主要问题是未持久化的对象。这些对象可能都以相同的ID开头,这不能正确地进行相等比较。即使您从未将对象放入集合中,但如果它们通过API公开,而其他人可以创建它们的实例并将其放入集合中,那么您已经向一些讨厌的bug敞开了大门。
https://stackoverflow.com/questions/917218
复制相似问题