hibernate如何使用equals()和hashCode()?

时间:2011-11-08 12:35:20

标签: java hibernate equals hashcode

如果你从db加载一个实体并以某种方式修改它,hibernate会使用equals / hashCode来比较实体的当前状态和它的快照,以确定是否需要执行sql更新?

如果它有这样的比较,我还有另一个问题:如果equals将返回true,那么hibernate会认为实体没有改变或试图使用它的默认比例(确定)吗?

2 个答案:

答案 0 :(得分:9)

请参阅JBoss社区网站上的Equals and HashCode。从那里:

  

为避免此问题,我们建议使用“半” - 唯一属性   你的持久化类实现equals()(和hashCode())。   基本上你应该认为你的数据库标识符没有   商业意义(记住,代理标识符属性和   无论如何都推荐自动生成的vales)。数据库   标识符属性应该只是一个对象标识符,基本上   应该只由Hibernate使用。当然,你也可以使用   数据库标识符作为方便的只读句柄,例如建立   Web应用程序中的链接。

换句话说,Hibernate使用equals和hashCode作为标识,而不是查看对象是否已被修改。它使用属性比较属性。

答案 1 :(得分:3)

不是Hibernate专家,但您可能会发现this部分手动启发。