簡體   English   中英

組合JPA,EJB和JSF托管bean的首選設計模式是什么?

[英]What is the preferred design pattern for combining JPA,EJB and JSF managed beans?

這是一個設計模式問題。 這是場景:我使用EJB3.0和JPA。 例如,假設我有一個可以屬於組的用戶。 所以在我的用戶實體中,我有一個方法getGroups(),它可以懶惰地獲取組。 我有一個UserDao,它是一個無狀態會話bean,它有一個方法
用戶getUser(int uid)

現在在我的JSF支持bean中,我注入UserDao的遠程接口並在其上調用getUser來獲取User bean。 但我無法訪問user.getGroups,因為它是一個分離的實體。 所以我可以想到三種方法:

  1. 在我的dao方法中,我也急切地獲取組,以便它們也可以在遠程用戶實體中訪問。 但問題是群體本身可能有懶惰的關系,而且我也必須急切地獲取,而那些可能有更多懶惰的關系等等。 因此,我將最終發送一個重量級的物體,其中大多數屬性我不需要。
  2. 我按原樣發送用戶並依賴我的客戶端不調用getGroups。 我可以在userdao中提供一個單獨的方法
    List <Integer> getGroupsIds(int userId)
    我有一個GroupDao,它有類似的方法getGroup(int groupId)和其他方法來獲取惰性關系的ID。

  3. 第三種選擇是根本不發送這些JPA實體,並創建其他POJO,如UserInfo,GroupInfo等,它們只包含每個實體的基本屬性並發送它們。 我可以在DAO中使用方法來獲取這些實體的不同關系,例如:
    List <GroupInfo> getGroupsForUser(int uid)
    List <UserInfo> getUsersInGroup(int gid)

那么這些中哪一個是首選模式。 或者是否有人在這里使用的其他模式?

還有第4和第5選項:-)

4)在相關API調用中包含“通脹水平”參數,例如getUser(id,inflationLevel)。 因此,您將委派責任選擇將通過線路發送的對象的哪些部分可供將使用該對象的客戶端使用。 您可以根據需要將所述隱式級別設置為粗粒度或細粒度。 一個典型的例子是類似BASIC(只填充直接屬性),ASSOCIATIONS(基本+直接集合/關聯),FULL(整個層次結構 - 所有相關對象)。

5)您可以編寫自己的代理,支持線上延遲初始化。 只有當您延遲加載的關聯對象(或屬性)可能很大但是(由客戶端)相對較少使用時,此方法才可行。

然后,當然,也有作為skaffman提到的Seam :-)

我已經實施了當前項目的第三個選項。 這不好。 每次你必須改變2-3個班而不是一個班。 字段是重復的,依此類推。 不是一種選擇。

如果你真的不需要User對象可以獲取的所有信息,那么請使用第二個選項。

如果事實證明,實際上你需要所有的用戶信息。 沒有其他人通過遠程服務使用您的User對象,然后使用您的User對象 - 請使用1st。

那里的另一個解決方案。 我也需要更好的一個。

為什么用戶實例是分離的? 如果您確實在使用JPA,則可以使用alive實例。 因此,當調用getGroups()時,懶惰地加載用戶組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM