Hibernate/JPA Parent-Child - Parent equals()/ hashCode()可以使用DB Id吗?

Gre*_*nie 3 java hibernate jpa java-ee

鉴于以下内容:

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

  ...

}
Run Code Online (Sandbox Code Playgroud)

让Parent.equals()和Parent.hashCode()仅使用id是不好的做法?我知道Child.equals()和Child.hashCode()应该为"自然键"使用一组不可变的属性,以便它们由Parent正确管理.但是,如果Parent始终是顶级对象(即它永远不是任何关联的反面),那么仅使用id是否有任何问题?

通过这样做,是否有任何可能表现出来的不良影响?我猜也许如果我这样做,当我添加一个子(或删除)时,Hibernate将无法告诉父更改(并且需要在DB中更新)?在这种情况下,我应该使用Parent.equals()和Parent.hashCode()的children属性吗?

我问,因为Hibernate docs明确表示不要将@Id属性用于"自然键"......

Jhe*_*ico 5

使用ID作为equals和hashCode基础的主要问题是未被包含的对象.这些对象可能都是以相同的ID开头的,因此无法正确比较这些对象.即使您从未将对象放入集合中,如果它们通过API公开,而其他人可以创建它们的实例并将它们放入集合中,那么您已经将自己打开了一些令人讨厌的错误.