2012-07-19 79 views
0

返回我使用JPA的EntityManager與Spring/Hibernate和EntityManager的似乎是行爲古怪,當我更新從Hibernate的Session的實體,然後從不同的休眠會話查看它的過時的值。JPA的EntityManager沒有entityManager.clear

我在我的應用程序如下配置:

  1. 的EHCache和啓用二級緩存的實體
  2. @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
  3. 擴展PersistenceContextem
  4. OpenEntityManagerInViewFilter

調用em.clear()解決了這個問題。我試過禁用二級緩存,查詢緩存等,但沒有幫助。我希望這位實體管理者能夠照顧到這一點。這是預期的嗎?我正在尋找一種更清潔的方法,並取消撥打em.clear()

回答

1

這些陳舊的實體通過擴展持久化上下文管理,獨立於交易。

注意,當一個新的事務開始,在 擴展持久化上下文的管理對象不從數據庫中裝載:在JPA 2.0規範這一如下拼寫。

沒有任何內置的功能來自動刷新它們。你可以做的是對單個實體使用clear或EntityManager.refresh,或者在映射中使用級聯REFRESH操作。

+0

它可能是與URL有關的東西?我注意到,當我更新實體時,url是save.html,當我獲取它的time/list.json時 - 這會導致陳舊。但是,當我嘗試使用time/list.html進行提取時,它工作正常!即使這兩個網址映射到使用相同的服務...我現在感到困惑。這是否擴展持久性上下文做基於URL的緩存? – Supra 2012-07-19 10:52:02

+0

Hibernate知道也不關心你的Web應用程序的URL,因爲它的設計在JavaSE中和JavaEE的環境中工作與'javax.servlet'的API不存在依賴關係(或與Web層有關的任何API)。您的問題必須與使用兩個不同會話的事實相關。 – 2012-07-19 12:45:41

+0

當然,我應該知道這一點。正如我所說,我感到困惑。 – Supra 2012-07-19 13:24:15

0

我找到了問題的根源。這是因爲我的更新和抓取是從兩個不同的servlet環境中完成的。我現在把它們放到相同的上下文中,它工作正常。

相關問題