2009-09-23 46 views
5

有在ejb-3_0-FR-SPEC-persistence.pdf讀取JPA:如何將持久化上下文與批量更新或刪除的結果進行同步?

持久化上下文不與批量更新的結果,同步或刪除

所以,如果我的聲明執行從表中刪除行的query.executeUpdate。那些相同的行在另一個實體中仍然存在一對多的集合。當我重新啓動應用程序時,我看到幻影實體現在已從集合中刪除。

那麼有沒有一個(很好\簡單\通用)同步JPA的緩存與批量更新\刪除的結果?

順便說一句。我使用EclipseLink,版本:Eclipse持久性服務 - 1.1.0.r3634。

謝謝,

菲爾。

+1

我相信有一個[http://stackoverflow.com/questions/5832415/entitymanager-refresh][1]。它實際上對我有效。 [1]:http://stackoverflow.com/questions/5832415/entitymanager-refresh – 2011-07-28 16:36:29

回答

5

您必須小心如何使用「緩存」這個詞,因爲這可能意味着不同的事情。

突出顯示的短語講述持久化上下文,可以將其視爲「第一級高速緩存」。爲了從數據庫您可以將最新的變化來更新它:

  1. 呼叫EntityManager.refresh()刷新實體的狀態。
  2. 或完全放棄實體管理器實例(在沖洗/清除適當的更改後)並從實體管理器工廠獲取新的實例管理器實例。從這個新實例中加載的任何實體都將從數據庫加載,因此包含最新的更改。

然後還可能有一個「二級緩存」,它不綁定到特定的實體管理器。您可以使用自己的API來刷新它(或者更確切地說,讓它重新填充本身)(緩存提供者之間不同)。

1

持久性上下文未更新以反映更新和刪除操作的結果。如果使用事務範圍的持久化上下文,則應該單獨在事務中執行批量操作,或者作爲事務中的第一個操作(請參閱EclipseLink事務簡介)。這是因爲任何由持久化上下文主動管理的實體都不會意識到數據庫級發生的實際變化。

下跌舒服,在這裏把我打倒在http://puspendu.wordpress.com/2010/12/22/sync-jpa-database-multiple-application/

4

這是你如何清除緩存數據。

entityManager.getEntityManagerFactory().getCache().evictAll(); 
+0

怎麼樣的表現繼續這樣的時候? – 2015-04-29 09:21:11

1

第一級緩存(EntityManager/transaction)需要手動刷新或清除。您可以刷新對象,調用clear()或獲取新的EntityManager。

提交事務時,第二級緩存(共享緩存)應自動失效。如果不是由於某種原因,那麼您可以使用JPA Cache API或EclipseLink JpaCache API來驅逐或使對象無效,或者可以刷新它們。