gpt4 book ai didi

java - 我是否正确使用 EJB?

转载 作者:行者123 更新时间:2023-12-04 06:54:47 25 4
gpt4 key购买 nike

我正在使用 JEE6 堆栈,包括 JPA 2.0、JSF 2.0、EJB 3.1 等。

我的架构设置方式如下:

我使用 hibernate 作为我的 JPA 提供程序有 JPA 注释的 DAO。
我有对应于我的 facelet/xhtml 页面的 JSF 托管 bean。
我有处理我所有数据库请求的 EJB。

我的 XHTML 页面具有调用我的托管 bean 的 JSF EL。我的托管 bean 包含对由 EJB 管理的 DAO 实体的引用。例如,我有一个映射到 db 表的用户实体。我有一个用户 EJB,它处理所有返回用户的 CRUD 操作。我有一个编辑用户的页面。高级工作流将是:导航到用户编辑页面 -> EL 调用位于加载用户的托管 bean 中的方法。该方法从 EJB 调用 userEJB.loadUser(user) 以从数据库中获取用户。用户被编辑并提交 -> 在托管 bean 中调用一个函数,该函数调用 EJB 中的一个函数来保存用户。等等。

我在使用 EJB 访问 JSF 页面中的数据时遇到问题。
我在延迟初始化错误方面遇到了很多问题,我认为这是由于我的设置方式造成的。

例如,我有一个 Client 实体,其中包含一个延迟加载的用户列表。为了得到
一个客户端 我在我的 EJB 中调用一个方法,该方法转到数据库,找到一个客户端并返回它。稍后的
我希望访问此客户端用户列表,为此我必须通过调用某种方法返回 EJB 以加载这些用户(因为它们是延迟加载的)。这意味着我必须创建一个方法,例如

public List<User> getUserListByClient(Client c)
{
c = em.merge(c); return c.getUserList();
}

这种方法的唯一目的是加载用户(我什至不认为这种方法是好的或有效的)。
如果我自己进行 session 管理,我只想让整个请求的 session 保持打开状态并直接访问属性,这很好,因为无论如何 session 都会打开,EJB 中似乎还有一层额外的间接这对我来说很困难。

我确实喜欢 EJB,因为我喜欢它们由容器控制、池化、免费提供事务管理等。但是,我觉得我使用它们不正确,或者我错误地设置了我的 JSF 应用程序。

任何反馈将不胜感激。

谢谢,

最佳答案

你的用法看起来不错。请记住 em.merge(c) 可能会将对 Client c 所做的更改保存到数据库中。如果您只想获取 Client c 的 UserList 而不保存对 Client c 所做的更改,那么您可以这样做:

public List<User> getUserListByClient(Client c)
{

Client client = em.find(Client.class, c.clientId);
return client.getUserList();

}

或者更好,只需将 Client Id 发送到 getUserListByClient 而不是传递完整的 Client 对象,只是为了节省一点点内存:)

关于java - 我是否正确使用 EJB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2693373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com