Hibernate:我是不是应该在 hashcode() 和 equals() 方法中包含“版本”字段
Posted
技术标签:
【中文标题】Hibernate:我是不是应该在 hashcode() 和 equals() 方法中包含“版本”字段【英文标题】:Hibernate: Should I include the 'version' field to hashcode() and equals() methodsHibernate:我是否应该在 hashcode() 和 equals() 方法中包含“版本”字段 【发布时间】:2011-11-14 11:18:07 【问题描述】:我知道,在覆盖我的持久实体的 hashcode()
和 equals()
时,我不应该包含 ID,而只包含唯一标识对象的有意义的属性。
但是,Hibernate 用于乐观并发控制的version
字段呢?我是否也应该跳过它,就像 ID 一样?如果我们说new User(name='John', version=1).equals(new User(name='John',version=2))
,它不会混淆Hibernate OCC吗?
【问题讨论】:
【参考方案1】:建议您使用业务键相等来实现equals() 和hashCode()。业务键相等意味着 equals() 方法只比较构成业务键的属性。它是一个可以识别我们在现实世界中的实例的键(自然候选键)
所以你应该不在equals()
hashcode()
中包含版本属性
参考:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/persistent-classes.html#persistent-classes-equalshashcode
【讨论】:
是的,我读过。但是由于那里没有提到version
字段并且考虑到它的目的(不同的值意味着不同的对象)我怀疑。但是 Hibernate 建议不要将version
用于应用程序中的任何其他内容。因此,我想得越多,我就越相信version
不应该包含在equals()
和hashcode()
中。以上是关于Hibernate:我是不是应该在 hashcode() 和 equals() 方法中包含“版本”字段的主要内容,如果未能解决你的问题,请参考以下文章
这些实体的equals和hashCode(Spring MVC + Hibernate)
可嵌入的 jpa 类是不是应该实现 equals 和 hashCode?
我是否应该在子类中重写equals和hashCode,即使它没有添加任何东西?
在 equals 和 hashcode 方法中使用自动生成的 Hibernate 实体对象的 id