我一直在开发我的第一个Java EE应用程序,它有许多JPA实体类,每个类都有一个对应的EJB类来处理业务逻辑。我所做的是将其中一个bean从Stateless更改为SessionScoped,因此我可以使用它来允许用户通过一系列表单字段工作,所有表单字段都在JSF表单上呈现。
然而,我开始认为这显然是错误的,因为我正在做一些事情,比如在我的EJB中实现诸如“submitStep1”和“goBackToStep2”之类的方法。这些方法设置了JSF页面上各种标记的render元素使用的指标,因此它们显然是“表示逻辑”。
我的问题是,我应该如何重新构建代码?我想我应该只有一个SessionScoped(或者应该是有状态的?)bean,它处理我的JSF页面的表示逻辑,并且能够使用所有其他ejbs(以及扩展我的JPA类)。这个bean将在我的应用程序的表示层级别,这意味着我的业务逻辑层不需要任何Session Scoped会话Bean。
现在这对我来说都很有意义,而且我可能会这样做。然而,我的问题的原因是在我的JSF xhtml页面上,我使用JSF EL标签来引用EJB内容。在编写表示层类时,是否需要注意与JPA相关的陷阱?
我知道我的问题很模糊,与具体的例子无关。虽然我在这个和其他网站上发现了很多有关Stateful v Stateless bean的信息,但我只想知道我的预期结构是最好的。
答案 0 :(得分:0)
为什么不将后备bean用于演示目的,因为它们是针对它的,并且您可以轻松配置其范围,并将EJB留给业务层?
在表示层上直接使用实体时,您应该了解事务范围,特别是关于延迟关系。也就是说,通常每个请求使用一个事务,这意味着在不同的请求中,实体将变为分离,因此您需要重新访问它们以便能够加载延迟关系。您可以使用过滤器自动执行每个请求或手动处理它。您也可以在不同的请求中保留相同的事务,但长事务通常不是一个好主意,特别是如果在此转换期间DB中有更新/创建。