java - JPA 实体身份和脏检查

标签 java hibernate jpa entity

来自 this SO answer :

The update() method forces an update to the persistent state of the object in the database, always scheduling an SQL UPDATE. ... It doesn’t matter if the item object is modified before or after it’s passed to update(). ... Hibernate always treats the object as dirty and schedules an SQL UPDATE., which will be executed during flush. On the other hand, merge() queries the database first, and doesn't perform update if state haven't changed.

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

最佳答案

Hibernate 中有两种脏检查机制。 JPA 是一种规范,由提供者决定如何实现。在 hibernate 的情况下:

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

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

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

关于java - JPA 实体身份和脏检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38445578/

相关文章:

java - 为什么 getView() 方法会自动调用多次?

java - Spring 数据 Neo4j : How do I pull a list of nodes of which I do not know the type?

java - 等待邮件未通过 jacob 发送/关闭

mysql - 如何减少Spring Jpa Hibernate项目部署时间?

sql - Hibernate 创建标准两次连接同一个表 - 尝试了 2 种方法,但有 2 个差异错误

java - JPA 子实体中的父外键为空

java - 复制实体集合并持久保存在 Hibernate/JPA 中

java - 如何从验证工厂的验证函数中获取变量或变量名称

mysql - JPA(Hibernate、Mysql)在使用 setmaxresults 时获取计数

java - 在 hibernate 中从 session.createQuery 获取超过 1 个对象