【发布时间】:2010-11-26 00:43:12
【问题描述】:
这是一个设计模式问题。这是场景:
我将 EJB3.0 与 JPA 一起使用。例如,假设我有一个可以属于组的用户。因此,在我的 User 实体中,我有一个方法 getGroups() 可以懒惰地获取组。我有一个 UserDao,它是一个无状态会话 bean,它有一个方法
用户 getUser(int uid)
现在,在我的 JSF 支持 bean 中,我注入了 UserDao 的远程接口并在其上调用 getUser 以获取 User bean。但我无法访问 user.getGroups 因为它是一个分离的实体。所以我可以在这里想到三种方法:
- 在我的 dao 方法中,我也急切地获取组,以便它们也可以在远程用户实体中访问。但是这个问题是 Group 本身可能有延迟获取的关系,而那些我也必须急切地获取,而那些可能有更多的延迟获取的关系等等。所以我最终会发送一个重量级的对象,我不需要它的大部分属性。
我按原样发送用户,并依靠我的客户不对其调用 getGroups。我可以在 userdao 中提供一个单独的方法,即
ListgetGroupsIds(int userId)
我有一个 GroupDao,它有类似的方法 getGroup(int groupId) 和其他方法来获取惰性关系的 Id。第三个选项是根本不发送这些 JPA 实体,而是创建其他 POJO,如 UserInfo、GroupInfo 等,它们只包含每个实体的基本属性并发送这些实体。我可以在 DAO 中使用方法来获取不同关系的这些实体,例如:
ListgetGroupsForUser(int uid)
ListgetUsersInGroup(int gid)
那么哪些是首选模式。还是人们在这里使用的其他模式?
【问题讨论】:
-
我怀疑顺利集成这些的最简单方法是使用 Seam:jboss.com/products/seam
-
是的,我对 Seam 知之甚少,这可能是最好的方法,但现在我坚持不使用 Seam
-
您是在使用特定的 JPA 实现,还是只是一般性地询问。 EclipseLink 和 Kodo 都会按需加载这些。或者开发者可以请求做一个 Eager fetch。
标签: java jpa jakarta-ee ejb-3.0