簡體   English   中英

JPA/Hibernate 查詢返回過時的結果

[英]JPA/Hibernate Query Returns Stale Results

我正在使用擴展持久上下文,因為它允許我在 object 上延遲加載一對多關系,並且在我將 object 與持久上下文“合並”之前,它也不需要 SELECT。

我有一個 DummyObject:

  1. “最后更新”日期字段

  2. 一對多關系

這個 Object 通過em.merge(DummyObject)調用在一個 JVM 中每5秒更新一次。

在另一個 JVM 中,我查詢 DummyObject 執行如下調用

em.createQuery("from DummyObject").getResultList();  

我也每5秒執行一次此查詢。

問題是,即使 Hibernate 正在生成正確的 SQL 語句(當我有語句登錄時),查詢產生的對象都具有連續調用后第一個查詢的時間戳,並且數據庫正在獲取更新正確(我已經驗證)。

我也嘗試過使用@Version 進行各種樂觀鎖定,但均無濟於事。 (看評論)

另一件事是,這在以下情況下確實可以正常工作:

  1. 我將 PersistentContextType 更改為TRANSACTIONAL (不允許我延遲加載 ONE-MANY 關系的東西)

  2. 在執行上面的查詢之前,我執行了一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM