我正在尝试为满足以下要求的小型研究原型和学生项目建立基于 JBoss AS7 的 Web 应用程序堆栈:
我想结合 PrimeFaces 组件为我的托管 bean 使用与 AJAX 相关的范围,例如ViewScope - 或者可能是 MyFaces Orchestra 中的 (View)AccessScope 。
基于 JPA 的持久性应该相当简单,无需处理 OpenSessionInView 模式等。我在 JPA2 中遇到的主要问题是可怕的LazyInitializationException,尤其是在 AJAX 调用中。我不需要手动控制对话。
我想使用尽可能少的依赖项,因此主要依赖于 JBoss AS7 附带的内容。
现在,我已经建立了一个项目,其中包含以下(主要是提供的)Maven 依赖项:
- CDI
- hibernate-2.0-api
- jboss-ejb-api_3.1_spec
- jboss-jsf-api_2.1_spec
- jboss-annotations-api_1.1_spec
- PrimeFaces 3
到目前为止,这看起来很苗条。缺少的是对更多特定于 JSF 的范围的支持,并且在 JSF 页面中迭代集合时,我总是得到一个 LazyInitializationException。现在,我的持久性服务类如下所示:
import javax.ejb.Stateful;
import javax.enterprise.context.RequestScoped;
@Stateful @RequestScoped
public class TestEntityService implements Serializable {
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
// ... some methods working with the entityManager ...
}
还有我的 ResourceFactory bean:
public class ResourceFactory {
@Produces @PersistenceUnit
private EntityManagerFactory entityManagerFactory;
}
我尝试与@Named
而不是@Stateful
,或@SessionScoped
代替的组合没有成功@RequestScoped
。但是,我发现添加 Seam 3 Persistence、Solder 和 Faces 模块似乎可以解决我的大部分问题,但这会给我的项目添加大量新的依赖项(例如 seam-security、prettyfaces、drools、joda-time 和其他依赖项)。
我的问题是:
EJB对 LazyInitializationException 有帮助吗?
@Stateful
还是由于注释,我实际上已经在这里使用了 EJB ?我从一个 jboss-as 示例应用程序中获取了这个,但我对所有这些@ManagedBean
,@Named
,@Stateful
,@LocalBean
注释之间的差异感到非常困惑......我所知道的是我需要以某种方式将我的实体管理器的生命周期绑定到服务豆。有人知道解决此问题的其他简单方法吗?使用 EAGER 获取不是一种选择,因为这似乎仅在每个实体不超过一个集合的情况下才有效......
我刚刚阅读了有关Apache CODI的信息,它似乎是 MyFaces Orchestra 的 CDI 继任者。这是Seam Faces的更好替代品吗?据我所知,它提供了 ViewScope 和 ViewAccessScope,但没有涉及事务管理。
如果在该领域有更多经验的人可以对此有所了解,那就太好了——我目前有点困惑,因为有很多图书馆在处理类似的问题,尽管最明显的是彼此不兼容(参见例如在这里)。谢谢!