Hibernate 如何使用 equals() 和 hashCode() 方法?

10
如果您从数据库加载一个实体并对其进行修改,Hibernate是否会使用equals/hashCode来比较实体的当前状态和快照,以确定是否需要执行SQL更新?
如果它执行此类比较,我有另一个问题:如果equals返回true,Hibernate会认为实体没有更改,还是尝试使用默认比较(以确保)?
2个回答

9
请参见JBoss社区网站上的"Equals and HashCode"。从那里开始:
为了避免这个问题,我们建议使用持久类的“半”唯一属性来实现equals()(和hashCode())。基本上,您应该认为您的数据库标识符根本没有业务含义(请记住,推荐使用代理标识符属性和自动生成的值)。数据库标识符属性只应用于对象标识符,并且基本上仅由Hibernate使用。当然,您也可以将数据库标识符用作方便的只读句柄,例如在Web应用程序中构建链接。
换句话说,Hibernate使用equals和hashCode进行标识,而不是查看对象是否已被修改。它对此使用属性对属性的比较。

1
在这个网站和页面上,我没有看到Hibernate使用equals()和hashCode()的证据。 - Ilya Serbis

3

虽然我不是Hibernate专家,但你可以在这个手册章节中找到启发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接