JPA实体身份和脏检查

Gio*_*nJh 1 java entity hibernate jpa

这个SO答案

update()方法强制更新到数据库中对象的持久状态,始终调度SQL UPDATE。...在将项目对象传递给update()之前或之后进行修改都没有关系。... Hibernate始终将对象视为脏对象,并计划将在刷新期间执行的SQL UPDATE.。另一方面,merge()首先查询数据库,如果状态未更改,则不执行更新。

我想到一个疑问:
Hibernate(或任何JPA实现)如何判断实体的状态是否已更改,从而需要进行更新操作?
我们应该实现equals或hashcode方法来帮助Hibernate做到这一点吗?如果不实现这些方法怎么办?

Ale*_*rov 5

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

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

第二种机制是在Hibernate实体上使用Instrumentation。在这种情况下,所有内容都包装在代理中。在这种情况下,休眠不比较对象本身,而是在您超时后修改值,代理服务器确保将实体标记为脏。

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