我知道JPA实现者(如Hibernate)监视附加到持久化上下文的实体,如果任何实体的任何字段发生更改,则更改将更新到数据库。
我的问题是,JPA如何跟踪变化?实体不是通过代理人截获的,所以当然不是通过截取“设置者”,它是如何完成的?
我对这个“脏检查”功能的实现细节很感兴趣。
答案 0 :(得分:7)
他们做的事情完全依赖于实现(即JPA规范在这里没有帮助你)。
某些实现(例如DataNucleus,OpenJPA)使用字节码增强,并且能够有效地管理自加载以来哪些字段是脏的(并且不需要保留原始字段值的快照)。
其他实现必须与之前的某些值(或通过与数据存储区的比较)进行比较。
答案 1 :(得分:5)
他们在加载时为加载的实体创建快照,将这些快照保存在内存中,并在刷新时将实体的快照与其当前状态进行比较。如果状态不同,则必须更新实体。如果它们仍匹配,则一定不能。
答案 2 :(得分:0)
请注意,与此同时,hibernate扩展了其脏检查选项。 Hibernate现在还支持字节码检测和自定义脏检查选项。有关这些较新选项的详细信息,请参阅this link。