繁体   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