JPA实体身份和脏检查

问题描述 投票:1回答:1

来自this SO answer

update()方法强制更新数据库中对象的持久状态,始终调度SQL UPDATE。 ...如果在将对象传递给update()之前或之后修改了它,则无关紧要。 ... Hibernate始终将对象视为脏对象并安排SQL UPDATE。,它将在刷新期间执行。另一方面,merge()首先查询数据库,如果状态未更改,则不执行更新。

我心中出现了一个疑问: Hibernate(或任何JPA实现)如何能够判断实体的状态是否已更改,以便需要更新操作? 我们应该实现equals或hashcode方法来帮助Hibernate这样做吗?如果不实施这些方法怎么办?

java hibernate jpa entity
1个回答
4
投票

在Hibernate中有两种脏检查机制。 JPA是规范,由提供者决定如何做到这一点。在休眠的情况下:

第一个是默认的无代理机制,其中hibernate会话保留每个对象的副本,并将此副本与通过EntityManager提交的所有内容进行比较以进行更新。

第二种机制是你在Hibernate实体上使用Instrumentation。在这种情况下,所有内容都包含在代理中。在这种情况下,hibernate不会比较对象本身,而是在超时时修改一个值,Proxy确保将实体标记为脏。

这是一个详细描述这两种方法的网站:https://vladmihalcea.com/the-anatomy-of-hibernate-dirty-checking/

© www.soinside.com 2019 - 2024. All rights reserved.