2009-12-27 124 views
2

當使用EntityManager時,最好是在PersistenceContext之間獲得一個實例並在我的程序中傳遞它,或者是否應該多次使用依賴注入?EntityManager初始化最佳實踐

在我的應用程序中,每個客戶端都將與有狀態會話bean進行通信,並且每個bean在某個時刻需要使用EntityManager。 我想bean方法是同時調用的(但我甚至不確定)。 如何保證我以線程安全的方式使用EntityManager?通過交易?在每個bean中有一個單獨的實例?

對不起,如果這是令人困惑的,我是新來的EJB/JPA,我找不到任何材料解決我的問題。

回答

2

是的,你應該注入EntityManager情況下(這將是爲每個線程/客戶端請求不同)爲您的有狀態會話Bean(這是不是同時調用,至少不是來自不同的客戶)。

雖然,創建DAO類沒有意義。 JPA已經是一個高級持久化API,它爲您提供RDBMS在不同JPA實現之間的獨立性和可移植性。所以,DAO只會給代碼庫增加混亂。

對於交易,您並不需要做任何事情。會話bean中的業務方法默認具有「Required」事務屬性,因此它們將始終在特定於客戶端的事務中運行。

+0

感謝您的回答。所以我的有狀態bean應該有一個'EntityManager'屬性,並通過參數傳遞給任何其他訪問數據庫的對象? – 2009-12-28 19:24:32

+1

是的,如果需要的話。但是,在使用EJB時​​,最好只從會話bean本身(無狀態或有狀態)訪問EntityManager API;那麼你永遠不需要傳遞EntityManager實例。當然,其他類型的託管bean(如MDB)也可以做同樣的事情。 – 2009-12-29 02:15:13

3

使用@PersistenceContext將您的EntityManager注入到您的DAO類中。這些是將處理數據庫操作的類。然後在所有其他(服務)類中注入您的DAO類(es)。你的DAO應該是無狀態Bean(不需要遠程接口的,只有本地)

+0

感謝您的回答。爲什麼DAO應該是一個無狀態bean? – 2009-12-28 19:29:29

+0

它不需要一個狀態。應該存儲什麼? – Bozho 2009-12-28 19:50:13