我知道JPA實現者(如Hibernate)監視連接到持久化上下文的實體,並且如果任何實體的任何字段發生更改,則更改將更新到數據庫。JPA髒檢查
我的問題是,JPA如何跟蹤更改?這些實體不被攔截(通過代理),所以當然不是截取「setters」,它是如何完成的?
我對這個「髒檢查」功能的實現細節感興趣。
我知道JPA實現者(如Hibernate)監視連接到持久化上下文的實體,並且如果任何實體的任何字段發生更改,則更改將更新到數據庫。JPA髒檢查
我的問題是,JPA如何跟蹤更改?這些實體不被攔截(通過代理),所以當然不是截取「setters」,它是如何完成的?
我對這個「髒檢查」功能的實現細節感興趣。
他們做的事情是完全依賴於(即JPA規範在這裏沒有幫助你)。
一些實現(例如DataNucleus,OpenJPA)使用字節碼增強功能,並且能夠有效地管理加載後(並且不需要保留原始字段值的快照)哪些字段是髒的。
其他實現必須與先前的某個值(或通過與數據存儲的比較)進行比較。
它們會在加載時創建加載實體的快照,將這些快照保存在內存中,並在刷新時間比較實體的快照和當前狀態。如果狀態不同,則必須更新實體。如果他們仍然匹配,那肯定不會。
請注意,在此期間,hibernate擴展了它的髒檢查選項。 Hibernate現在還支持字節代碼檢測和自定義髒檢查選項。有關這些較新選項的更多信息,請參閱this link。