2016-02-18 62 views
0

我正在設計一個非常簡單的Web應用程序,它具有一個REST Web服務,該服務利用JPA與PostgreSQL數據庫交互並在TomEE中運行。EntityManager應該注入EJB嗎?

我不相信我有需要(或希望)手動管理EntityManager的生命週期,因此我打算用容器管理EntityManagers(可能是交易範圍的)來卸載該苦差事到TomEE。

我不相信我有需要(或期望)手動管理容器管理實體管理器需要的JTA事務。

最後,我打算使用DAO類從業務邏輯中分離任何查詢,這是我的REST Web服務。

對於每個DAO類,我最好的選擇是使用@PersistenceContext註釋來獲得對EntityManager的引用的EJB嗎?如果是這樣,DOA應該是什麼類型的EJB?我見過示例/博客暗示無狀態,有狀態,單身,甚至完全忘記了DAO,通過將EntityManager注入到Web服務本身。處理這個問題的最好方法是什麼?

回答

0

每個DAO應該是一個無狀態會話Bean,其中DB引用被注入。

爲了避免複製圍繞EJB的代碼,GenericDAO通過EntityManager執行CRUD操作會更好。

如果需要調用某個服務,通常我更願意爲每個Ws客戶端創建一個EJB。

在提供Ws服務器的情況下,我總是注入我需要的EJB實例,而不是注入EntityManager實例,因爲擁有單個訪問點會是件好事。

+0

EntityManager已經提供了CRUD操作;你爲什麼要把它包裝在更多(冗餘)的代碼中? –

+0

如果你已經有了這個範圍的DAO,一次又一次注入EntityManager是什麼意思?然後通過將它注入到任何地方,您都無法知道數據更改的位置......您將不會擁有一個訪問點 –

0

爲EJB創建一個類會爲EJB提供一些EJB和Container管理的功能,例如事務管理,線程安全性,安全性等。

Ejb in Action本書中,據說建議有一個簡單的DAO類(不是EJB),它與EntityManager一起工作。 DAO類不應該涉及事務管理和EJB所具有的其他功能,相反,應始終有一個使用DAO類的EJB(使用@Inject註釋),其他服務(如REST或SOAP Web服務)應調用該EJB我們需要的DAO。

將所有類(如DAO類和實用程序類)轉換爲EJB將給容器帶來負擔,並會使其更難管理所有EJB。