JSF/EJB3避免视图层中的延迟初始化异常

JSF/EJB3避免视图层中的延迟初始化异常,jsf,ejb,Jsf,Ejb,我有以下JSF/PrimeFaces EJB体系结构: [JSF/PrimeFaces xhtml视图]-->[@ManagedBean JSF bean]-->[@Stateless EJB3 bean]--JPA-->[DB] 也就是说,JSF视图显示它们在其后台bean上访问的实体和集合(@ManagedBean),这些集合和实体依次通过调用无状态的EJB3“facade”来获取注入了EntityManager的bean,并使用JPA访问数据库,并由Hibernate支持。无状态的EJB3

我有以下JSF/PrimeFaces EJB体系结构:

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

也就是说,JSF视图显示它们在其后台bean上访问的实体和集合(@ManagedBean),这些集合和实体依次通过调用无状态的EJB3“facade”来获取注入了EntityManager的bean,并使用JPA访问数据库,并由Hibernate支持。无状态的EJB3bean也提供一些服务,但它们的大部分作用是根据需要显示它们的xhtml视图的请求,从数据库中提供实体对象(JPA-注释)

现在的问题是:如果我的理解是正确的,那么当无状态ejb3bean返回实体bean时,当每个EJB3bean方法划分事务时,实体bean就会分离。通常情况下,当xhtml视图和JSF-Managedbean浏览如此获取的实体对象(一对多集合等)的图形时,我经常会遇到如下延迟初始化异常:

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

唯一有效的方法是将集合更改为“渴望”加载,但这不是一个实用的解决方案。当分离的JPA实体进入视图层时,为了一次性避免惰性初始化异常,而不必以特殊方式处理每种情况,有哪些好的模式可以使用?

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

Hibernate.initialize(proxy)
或者将fetch type设置为EAGER,在加载实体时将获取整个实体。 第二种也是更恰当的方法(在我看来)是保留实体经理,只要你保留实体。这可以使用如下@Stateful会话完成:

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

   ...... the business method
}
只要保留实体,就保留对ejb的引用。可以找到有关扩展持久性上下文的更多信息。
保持实体管理器的另一种方法是使用CDI模块,如或,它提供了创建和保持会话范围的实体管理器的功能。

是否尝试Hibernate.initialize(proxy)来初始化字段?为什么这与在一对多集合中指定FetchType.EAGER不同?