我正在使用 JEE6 堆栈,包括 JPA 2.0、JSF 2.0、EJB 3.1 等。
我的架构设置方式如下:
我有 JPA 注释的 DAO,使用 hibernate 作为我的 JPA 提供程序。
我有与我的facelet/xhtml 页面相对应的JSF 托管bean。
我有处理所有数据库请求的 EJB。
我的 XHTML 页面有 JSF EL,它可以调用我的托管 bean。我的托管 bean 包含对由 EJB 管理的 DAO 实体的引用。例如,我有一个映射到数据库表的用户实体。我有一个用户 EJB,它处理返回用户的所有 CRUD 操作。我有一个编辑用户的页面。高级工作流程将是:导航到用户编辑页面 -> EL 调用位于加载用户的托管 bean 中的方法。该方法从 EJB 调用 userEJB.loadUser(user) 以从数据库获取用户。用户被编辑并提交 -> 在托管 bean 中调用一个函数,该函数调用 EJB 中的一个函数来保存用户。 ETC。
我在使用 EJB 访问 JSF 页面中的数据时遇到问题。
我遇到了很多延迟初始化错误的问题,我相信这是由于我的设置方式造成的。
例如,我有一个客户端实体,它有一个延迟加载的用户列表。为了得到
客户端 我在 EJB 中调用一个方法,该方法会访问数据库、找到客户端并返回它。稍后的
我希望访问此客户端的用户列表,为此我必须通过调用某种方法返回 EJB 以加载这些用户(因为它们是延迟加载的)。这意味着我必须创建一个方法,例如
public List<User> getUserListByClient(Client c)
{
c = em.merge(c); return c.getUserList();
}
这种方法的唯一目的是加载用户(我什至不确定这种方法是否良好或有效)。
如果我自己进行会话管理,我希望在整个请求中保持会话打开并直接访问属性,这样就可以了,因为会话无论如何都会打开,EJB 中似乎有一层额外的间接层这让我的事情变得很困难。
我确实喜欢 EJB,因为我喜欢它们由容器控制、池化、免费提供事务管理等事实。但是,我感觉我错误地使用了它们,或者我错误地设置了我的 JSF 应用程序。
任何反馈将不胜感激。
thanks,
如果我正在做会话管理
我自己,我想离开
会话针对整个请求打开
并直接访问该属性,这
会很好,因为会议会是
无论如何打开
确实,这就是在视图中打开会话 http://community.jboss.org/wiki/OpenSessioninView模式(也称为在视图中打开 EntityManager)。它也可以与 EJB 一起使用。理想情况下,事务应该在业务层/EJB 中进行管理,因此这与纯层架构略有不同。但它解决了视图中延迟加载的问题,而且很简单。
否则,您必须确保立即加载事务结束后将使用的信息。或者您可能依赖 DTO,但随后它就开始变得麻烦。
这里还有两个链接涵盖该主题并讨论优点/缺点和替代方案:
- 那么问题:在视图模式中打开会话 https://stackoverflow.com/questions/1847040/open-session-in-view-pattern
- 谢比亚博客:JPA 实施模式 http://blog.xebia.com/category/jpa/implementation-patterns/尤其是this one http://blog.xebia.com/2009/04/27/jpa-implementation-patterns-lazy-loading/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)