2012-05-25 91 views
4

我正在使用JBoss7開發基於JavaEE6的Web應用程序。 在我的申請,我注入了EntityManager在我的EJB爲:JPA的EntityManager應該是RequestScoped?

class ForumServiceEJB 
{ 
    @PersistenceContext(type=EXTENDED) 
    private EntityManager em; 

} 

class TopicServiceEJB 
{ 
    @PersistenceContext(type=EXTENDED) 
    private EntityManager em; 

} 

的問題,當我更新使用ForumServiceEJB的EntityManager的一些數據則更改被製作成數據庫,但TopicServiceEJB的EntityManager的是無法看到這些變化和結果總是從緩存中獲取。

我正在使用ExtendedPerssisteenceContext作爲我的實體包含延遲加載類型的子實體集合。

如何使用/注入類型ExtendedPersistenceContext的EntityManager並在一個EJB中使不同的EntityManager仍然可以看到由其他不同的EJB EntityManagers所做的更改?

我讀EntityManagers的地方應該是RequestScoped對象。

public class MyEntityManagerProducers { 
@Produces @RequestScoped 
public EntityManager createDbEm() { 
    return Persistence.createEntityManagerFactory("forumDb"). 
      createEntityManager(); 
} 

public void disposeUdEm(@Disposes EntityManager em) { 
    em.close(); 
} 

這是要走的路嗎?

回答

1

我正在使用ExtendedPerssisteenceContext作爲My Entities包含子對象 Lazy Loading類型的實體集合。

這不是使用EXTENDED的好理由。我建議你製作它default,這是TRANSACTION。在非企業環境中或在使用應用程序管理的持久性時,使用EntityManager請求範圍或方法範圍很好,因爲這不是一個非常繁重的對象。而且,既不使用應用程序範圍的EntityManager也不是線程安全的好主意。

話雖如此,因爲您正在使用JBoss,您應該讓容器處理EntityManager的生命週期,以防您使用JTA。因此,只要注入與一切default

注:

只有有狀態會話bean可以有一個容器管理,擴展的實體管理器。

鏈接:

建議:

你的業務方法應該知道是否加載子女或沒有。但這是理想的情況。很多時候,我們不能說這一點,完全取決於用戶的輸入 - 我們無法很好地預測這一點。因此,有兩種解決方案可用,

  1. 進行單獨的AJAX調用加載孩子
  2. 使用過濾器稱爲開會話的視圖。我更喜歡前者。

鏈接:

+0

那麼如何應對視圖中顯示子集?我還應該在EntityManager關閉之前編寫JPQL來加載惰性集合嗎? –

+0

@ sivaprasadreddy.k:你的商業方法應該知道是否加載孩子。但這是理想的情況。很多時候,我們不能說這一點,完全取決於用戶的輸入 - 我們無法很好地預測這一點。因此,有兩種解決方案可供使用,1.創建單獨的AJAX調用來加載子項2.使用名爲open-session-in-view的過濾器。我更喜歡前者。 –

+0

非常感謝Adeel Ansari。 –