[英]JPA/Hibernate Query Returns Stale Results
我正在使用擴展持久上下文,因為它允許我在 object 上延遲加載一對多關系,並且在我將 object 與持久上下文“合並”之前,它也不需要 SELECT。
我有一個 DummyObject:
“最后更新”日期字段
一對多關系
這個 Object 通過em.merge(DummyObject)
調用在一個 JVM 中每5秒更新一次。
在另一個 JVM 中,我查詢 DummyObject 執行如下調用
em.createQuery("from DummyObject").getResultList();
我也每5秒執行一次此查詢。
問題是,即使 Hibernate 正在生成正確的 SQL 語句(當我有語句登錄時),查詢產生的對象都具有連續調用后第一個查詢的時間戳,並且數據庫正在獲取更新正確(我已經驗證)。
我也嘗試過使用@Version 進行各種樂觀鎖定,但均無濟於事。 (看評論)
另一件事是,這在以下情況下確實可以正常工作:
我將 PersistentContextType 更改為TRANSACTIONAL (不允許我延遲加載 ONE-MANY 關系的東西)
在執行上面的查詢之前,我執行了一個 EntityManager.clear() 調用(這也不允許我延遲加載 ONE-MANY 關系)。
為什么我的查詢返回陳舊數據? 我沒有啟用二級緩存或查詢緩存。
難道我做錯了什么? 我可以通過 query.setHint(, ) 設置什么嗎?
也許我沒有正確理解“ EXTENDED ”與TRANSACTIONAL 。
hibernate session 正在緩存持久對象。 因此,因為您正在修改一個 JVM (A) 並在另一個 JVM(B) 中讀取,所以需要刷新 B 的會話以查看更改。 您可以打開一個新的 session 或逐出/刷新持久對象。 您還可以跨兩個 JVM 復制會話,這可能會解決您的問題。 或者您可以嘗試更改查詢以僅返回您需要的“DummyObject”片段,並且僅在需要時讀取持久性 object。 您也可以嘗試無狀態的 session。
您是否嘗試過在獲取之前執行 flush()?
有趣的。 在我看來,您的持久性上下文中的實體實例似乎未使用查詢結果進行更新。 這可能是設計使然——您可能會通過執行查詢不小心覆蓋本地更改。
更糟糕的是,JPA 中沒有辦法分離單個實例。 您要么清除整個上下文,要么不清除。 所以這也不是一個可能的解決方案。
PersistanceContext
class 中有一個refresh()
方法可用,它從數據庫中獲取更改並相應地更新實體實例。 但我可以看出這在實際實施中可能不適用。 所以我的回答是:你可能無法讓它工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.