JPA脏检查

Mr.*_*art 3 orm persistence hibernate ejb jpa

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

我的问题是,JPA如何跟踪变化?实体不是通过代理人截获的,所以当然不是通过截取"设置者",它是如何完成的?

我对这个"脏检查"功能的实现细节很感兴趣.

Dat*_*eus 8

他们做的事情完全取决于实现(即JPA规范在这里没有帮助你).

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

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


JB *_*zet 5

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