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 脏检查的主要内容,如果未能解决你的问题,请参考以下文章