hashCode()
/equals()
实现。大多数(如果不是全部)依赖于Hibernate,但我想讨论JPA实现中性的问题(顺便说一下,我正在使用EclipseLink)。所有可能的实现都有自己的优点和缺点,涉及到以下方面:
hashCode()
/equals()
合同符合性(不可变性)适用于List
/Set
操作- 是否可以检测到相同对象(例如来自不同会话、从惰性加载的数据结构中的动态代理)
- 实体在分离(或未持久化)状态下是否表现正确
- 不要覆盖它们;依赖于
Object.equals()
和Object.hashCode()
hashCode()
/equals()
有效- 无法识别相同的对象,动态代理存在问题
- 与分离实体没有问题
- 根据主键覆盖它们
hashCode()
/equals()
被破坏了- 正确的标识(对于所有受控实体)
- 与分离实体存在问题
- 根据业务ID(非主键字段;外键怎么办?)覆盖它们
hashCode()
/equals()
被破坏了- 正确的标识(对于所有受控实体)
- 与分离实体没有问题
我的问题是:
- 我是否错过了任何选项和/或优缺点?
- 您选择了哪个选项以及为什么?
更新1:
更新2:
感谢您的回答 - 其中大部分质量很高。不幸的是,我仍然不确定哪种方法对于实际应用程序最好,或者如何确定我的应用程序的最佳方法。因此,我将保持问题开放,并希望进行更多讨论和/或意见。
hashcode()
应该返回相同的值,除非在equals()
实现中使用的任何字段发生更改。换句话说,如果您的类中有三个字段,并且您的equals()
方法仅使用其中两个来确定实例的相等性,则可以期望hashcode()
返回值在更改其中一个字段的值时发生更改 - 当您考虑到此对象实例不再“等于”旧实例所代表的值时,这是有意义的。 - matt b