update()方法强制更新持久状态 数据库中的对象,始终调度SQL UPDATE。 ......它 如果在对象之前或之后修改了对象,则无关紧要 传递给update()。 ... Hibernate总是将对象视为脏 并安排一个SQL UPDATE。,它将在刷新期间执行。上 另一方面,merge()首先查询数据库,而不是 如果状态没有改变,则执行更新。
我心中出现了一个疑问:
Hibernate(或任何JPA实现)如何能够判断实体的状态是否已更改,以便需要更新操作?
我们应该实现equals或hashcode方法来帮助Hibernate这样做吗?
如果不实施这些方法怎么办?
答案 0 :(得分:4)
Hibernate中有两种脏检查机制。 JPA是规范,由提供者决定如何做到这一点。在休眠的情况下:
第一个是默认的无代理机制,其中hibernate会话保留每个对象的副本,并将此副本与通过EntityManager提交以进行更新的所有内容进行比较。
第二种机制是在Hibernate实体上使用Instrumentation。在这种情况下,所有内容都包含在代理中。在这种情况下,hibernate不会比较对象本身,而是超时修改一个值,Proxy确保实体被标记为脏。
以下是一个详细介绍这两种方法的网站:https://vladmihalcea.com/the-anatomy-of-hibernate-dirty-checking/