【问题标题】:JPA entity identity and dirty checkingJPA 实体身份和脏检查
【发布时间】:2018-09-18 05:06:22
【问题描述】:

来自this SO answer

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

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

【问题讨论】:

    标签: java hibernate jpa entity


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 呵呵,我们又来了 :-) 如果我合并一个分离的对象怎么办?
    • Hibernate 如何知道分离的实体是否等于数据库上的相应实体?
    • 它没有,这就是你有乐观锁定的原因。首先,它检查是否存在具有相同标识的托管对象。如果存在,它会应用更改并尝试保存它。如果保存成功,则数据显然不是陈旧的。如果没有,很可能会抛出 staleobjectexception。第二种情况是托管对象不存在。这会导致 SQL 选择。
    • 如果您有兴趣,这里有一个链接,其中包含有关合并算法的更多详细信息techblog.bozho.net/how-does-merge-work-in-jpa-and-hibernate
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 2021-02-09
    相关资源
    最近更新 更多