JPA实体身份和脏检查

时间:2016-07-18 20:34:42

标签: java hibernate jpa entity

来自this SO answer

  

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

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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