JPA 脏检查

Posted

技术标签:

【中文标题】JPA 脏检查【英文标题】:JPA dirty checking 【发布时间】:2011-12-14 16:23:03 【问题描述】:

我知道 JPA 实现者(如 Hibernate)监视附加到持久性上下文的实体,如果任何实体的任何字段发生更改,则更改将更新到数据库。

我的问题是,JPA 如何跟踪更改?实体没有被拦截(通过代理),所以肯定不是通过“setter”的拦截,它是如何完成的?

我对这个“脏检查”功能的实现细节很感兴趣。

【问题讨论】:

【参考方案1】:

他们所做的事情完全依赖于实现(即 JPA 规范在这里对您没有一点帮助)。

一些实现(例如 DataNucleus、OpenJPA)使用字节码增强,并且能够有效地管理自加载以来哪些字段是脏的(并且不需要保留原始字段值的快照)。

其他实现必须与之前的某个值进行比较(或通过与数据存储区的比较)。

【讨论】:

【参考方案2】:

它们在加载时对加载的实体进行快照,将这些快照保存在内存中,并在刷新时将实体的快照与其当前状态进行比较。如果状态不同,则必须更新实体。如果它们仍然匹配,则一定不匹配。

【讨论】:

【参考方案3】:

请注意,与此同时,hibernate 扩展了它的脏检查选项。 Hibernate 现在还支持字节码检测和自定义脏检查选项。有关这些新选项的更多信息,请参阅this link。

【讨论】:

以上是关于JPA 脏检查的主要内容,如果未能解决你的问题,请参考以下文章

8.29 脏检查笔记

Hibernate——脏检查和缓存清理机制

脏检查和刷新缓存机制

关于Hibernate脏检查与快照

脏检查和快照的故事

脏检查 和 缓存清理机制