JPA hashCode()/ equals()困境

问题:

这里有关于JPA实体的some discussions,JPA实体类应该使用哪些hashCode() equals()实现。大多数(如果不是全部)依赖于Hibernate,但是我想讨论JPA实现中立(我使用EclipseLink,顺便说一下)。
所有可能的实现都有自己的优点缺点

  •   Set合同一致性(不可变)
  • 是否可以检测到相同对象(例如来自不同会话,来自延迟加载的数据结构的动态代理)
  • 实体在分离(或不持续)状态中的行为是否正确
     

我可以看到,有三个选项

  1. 不要超越他们;依靠Object.equals()Object.hashCode()
     

    • hashCode()/equals() work
    • cannot identify identical objects, problems with dynamic proxies
    • no problems with detached entities
  2. 根据首要的关键覆盖它们
     

    • hashCode()/equals() are broken
    • correct identity (for all managed entities)
    • problems with detached entities
  3. 根据商务-ID(非主键字段;外键怎么办)覆盖它们?

     

    • hashCode()/equals() are broken
    • correct identity (for all managed entities)
    • no problems with detached entities

 我的问题是:

  1. 我错过了一个选项和/或pro / con点吗?
  2. 你选择了什么选择,为什么?

 

更新1:
hashCode() equals()被破坏”,我的意思是连续的hashCode()调用可能会返回不同的值,这是(当正确实现时)在Object API文档的意义上不会破坏,但是会导致问题尝试从MapSet或其他基于哈希的Collection检索变更的实体。因此,在某些情况下,JPA实现(至少EclipseLink)将无法正常工作。
 更新2:
感谢您的答案 – 大多数都有卓越的品质。
不幸的是,我仍然不确定哪种方法对于现实生活中的应用程序是最好的,或者如何确定我的应用程序的最佳方法。所以,我会保持这个问题的开放,并希望有更多的讨论和/或意见。

回答:

阅读这篇非常漂亮的文章:Don’t Let Hibernate Steal Your Identity
文章的结论如下:

当对象持久化到数据库时,对象身份在实际上难以实现。然而,这些问题完全来自允许对象在保存之前不存在id而存在。我们可以通过将对象ID分配给诸如Hibernate之类的对象关系映射框架来解决这些问题。相反,一旦对象被实例化,就可以分配对象ID。这使得对象标识简单无错,并减少域模型中所需的代码量。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: The JPA hashCode() / equals() dilemma

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 20 = 26