gpt4 book ai didi

JSF/EJB3避免 View 层延迟初始化异常

转载 作者:行者123 更新时间:2023-12-04 19:39:51 25 4
gpt4 key购买 nike

我有以下 JSF/PrimeFaces EJB 架构:

[JSF/PrimeFaces xhtml View ] --> [@ManagedBean JSF bean] --> [@Stateless EJB3 bean] --JPA--> [DB]

也就是说,JSF View 显示它们在支持 bean (@ManagedBean) 上访问的实体和集合,这些集合和实体又通过调用无状态 EJB3 获取“外观”bean 注入(inject)了 EntityManager 并使用 Hibernate 支持的 JPA 访问数据库。无状态 EJB3 bean 也提供一些服务,但它们的大部分作用是根据 >xhtml 需要显示它们的 View 。

事情是这样的:如果我的理解是正确的,当实体 bean 被无状态 EJB3 bean 返回时,它们变得分离,因为每个 EJB3 bean 方法划定一个事务。通常情况下,当 xhtml View 和 JSF Managed bean 导航如此获取的实体对象的图形(一对多集合等)时,我经常遇到如下延迟初始化异常:

javax.el.ELException: ... org.hibernate.LazyInitializationException: failed
to lazily initialize a collection of role: ..., no session or session was closed

唯一可行的方法是将集合更改为 EAGER -ly loaded 但这不是一个实用的解决方案。当分离的 JPA 实体找到通往 View 层的路径时,可以使用哪些好的模式来避免一劳永逸的惰性初始化异常,而不必以临时方式处理每种情况?

最佳答案

有两种处理惰性关联的方法。第一种方法是使用以下方法初始化实体:

Hibernate.initialize(proxy)

或将获取类型设置为 EAGER,这将在您加载实体时获取整个实体。第二种也是更合适的方法(在我看来)是在保留实体的同时保留实体管理器。这可以使用这样的 @Stateful session 来完成:

@Stateful
public class UserService {
@PersistenceContext(type=EXTENDED)
private EntityManager entityManager;

...... the business method
}

并在保留实体的同时保留对 ejb 的引用。可以找到有关扩展持久性上下文的更多信息 here .保留实体管理器的其他方法是使用 CDI 模块,如 seam-persistenceCODI提供创建 EntityManager 并将其保留在对话范围内的功能。

关于JSF/EJB3避免 View 层延迟初始化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13089888/

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