如果你从db加载一个实体并以某种方式修改它,hibernate会使用equals / hashCode来比较实体的当前状态和它的快照,以确定是否需要执行sql更新?
如果它有这样的比较,我还有另一个问题:如果equals将返回true,那么hibernate会认为实体没有改变或试图使用它的默认比例(确定)吗?
答案 0 :(得分:9)
请参阅JBoss社区网站上的Equals and HashCode。从那里:
为避免此问题,我们建议使用“半” - 唯一属性 你的持久化类实现equals()(和hashCode())。 基本上你应该认为你的数据库标识符没有 商业意义(记住,代理标识符属性和 无论如何都推荐自动生成的vales)。数据库 标识符属性应该只是一个对象标识符,基本上 应该只由Hibernate使用。当然,你也可以使用 数据库标识符作为方便的只读句柄,例如建立 Web应用程序中的链接。
换句话说,Hibernate使用equals和hashCode作为标识,而不是查看对象是否已被修改。它使用属性比较属性。
答案 1 :(得分:3)
不是Hibernate专家,但您可能会发现this部分手动启发。