这是一个设计模式问题。以下是场景:
我正在使用EJB3.0和JPA。例如,假设我有一个用户可以属于多个组。因此,在我的User实体中,我有一个获取组的方法getGroups(),它会懒加载。我还有一个UserDao,它是一个无状态会话bean,它有一个方法getUser(int uid)。
现在,在我的JSF后备bean中,我注入了UserDao的远程接口,并调用它的getUser方法来获取User bean。但是,我无法访问user.getGroups,因为它是一个分离的实体。因此,我可以考虑三种方法:
1. 在我的dao方法中,我急切地获取组,以便它们也可以在远程User实体中访问。但是这样做的问题是Group本身可能具有懒惰获取的关系,那么我也必须急切地获取它们,而这些关系可能还有更多的懒惰获取的关系,依此类推。因此,我最终会发送一个重量级对象,其中大部分属性我将不需要。
2. 我按原样发送User,并依赖于我的客户端不在其上调用getGroups。我可以在userdao中提供一个单独的方法,如下所示: List getGroupsIds(int userId) 我还有一个GroupDao,它有类似的方法getGroup(int groupId)和其他方法来获取懒惰关系的Ids。
3. 第三个选择是根本不发送这些JPA实体,并创建其他POJO,如UserInfo、GroupInfo等,它们只包含每个实体的基本属性并发送这些实体。我可以在DAO中编写方法来获取不同关系的这些实体,例如: List getGroupsForUser(int uid) List getUsersInGroup(int gid)
那么这些中哪一个是首选模式呢?还是有其他人在这里使用的模式吗?
现在,在我的JSF后备bean中,我注入了UserDao的远程接口,并调用它的getUser方法来获取User bean。但是,我无法访问user.getGroups,因为它是一个分离的实体。因此,我可以考虑三种方法:
1. 在我的dao方法中,我急切地获取组,以便它们也可以在远程User实体中访问。但是这样做的问题是Group本身可能具有懒惰获取的关系,那么我也必须急切地获取它们,而这些关系可能还有更多的懒惰获取的关系,依此类推。因此,我最终会发送一个重量级对象,其中大部分属性我将不需要。
2. 我按原样发送User,并依赖于我的客户端不在其上调用getGroups。我可以在userdao中提供一个单独的方法,如下所示: List getGroupsIds(int userId) 我还有一个GroupDao,它有类似的方法getGroup(int groupId)和其他方法来获取懒惰关系的Ids。
3. 第三个选择是根本不发送这些JPA实体,并创建其他POJO,如UserInfo、GroupInfo等,它们只包含每个实体的基本属性并发送这些实体。我可以在DAO中编写方法来获取不同关系的这些实体,例如: List getGroupsForUser(int uid) List getUsersInGroup(int gid)
那么这些中哪一个是首选模式呢?还是有其他人在这里使用的模式吗?