2012-01-03 50 views
2

我對JSF和JPA做了一些研究。閱讀一些教程,並遵循一些示例。在此之前,我會創建Managed Beans,Models和Services來處理我的應用程序。將JSF與JPA集成

在此模式中包含JPA的最佳做法是什麼?我應該在相同的服務類中包含JPQL查詢和數據庫調用嗎?在一些例子中,我看到JPA在與Invoke應用程序階段調用的方法相同的託管bean中實現,或者我看到JPA在其他託管bean中實現?與這兩者合作的常用做法是什麼?

+0

它實際上不回答你的問題。只是我們的經驗。如果您正在創建公共站點並希望獲得良好的性能,請不要使用JSF。我們用JSF獲得了很多內存和CPU瓶頸。 – abdolence 2012-01-03 21:31:26

+0

謝謝!這更像是一個與JEE結合使用的個人項目。 – TGM 2012-01-03 21:38:04

回答

2

您應該將您的JPA訪問合併到一種或另一種DAO或服務層中,如果沒有其他原因,您可以將該DAO層用於單元測試。所有的JSF託管bean將通過該類路由他們的JPA訪問。這樣,每當您從JSF託管的bean訪問JPA時,都可以模擬單個DAO方法調用,而不是單獨模擬EntityManagerQuery等。

現在,更難的問題是:DAO /服務層應該是另一個JSF託管bean,EJB還是其他什麼?這在某種程度上不如承認您想要分開JPA訪問那麼重要。

就我個人而言,我開始將DAO作爲JSF管理bean的另一種風格,使用@ManagedProperty進行注入。然後,我在Java EE 6中發現了CDI,並用@Named/@Inject取代了它們的POJO。

但是,如果您正在進行寫入操作而不只是讀取操作,那麼您應該考慮擁有一個單獨的服務層,您可以在其中聲明事務 - 可能@Stateless如果您使用的是JSF,則EJB最有意義。

希望這會有所幫助!

+1

也 - 在我進入CDI之前,我已經寫了一段時間了。你可能會發現它很有用,雖然你的里程可能會有所不同,它可能已經過時了。 http://wrschneider.blogspot.com/2011/09/jsf-jpa-without-ejb-or-spring.html – wrschneider 2012-01-03 21:30:08

+0

所以你說的是每個實體的CRUD(和其他方法)應該放在一個單獨的課堂權利?在這種情況下,我不明白爲什麼我需要這個DAO層。 – TGM 2012-01-03 21:50:17

2

我是一個自學者,所以請原諒我的措辭,可能不合適。

如果您查看answer,可以找到NetBeans嚮導創建RESTful Web服務的鏈接。這肯定超出了你的問題的範圍,但生成的DAO類非常有用,可以用於JSF項目。如果你想要的話,你可以刪除JAX-RS RESTful註釋,但保留其餘部分。

然後我向Beans注入自動生成的Facade類(使用EJB註釋)。在這些Facade和Entity類中,基本的JPA查詢已經寫好了。

如果您需要創建更復雜的查詢,還可以使用類型安全的Criteria API而不是JPQL。初始工作量更大,但Criteria API允許您以OO方式編寫複雜查詢,這對於具體情況也很有幫助,例如在「WHERE」語句中使用多個條件(其數量動態生成,如Advanced Search) 。