【问题标题】:Exception while lazily loading a collection from entity延迟从实体加载集合时出现异常
【发布时间】:2011-10-13 09:29:07
【问题描述】:

我担心我错过了一个非常基本的观点,但我现在被困住了,希望有人能把我盯着它的眼睛指向正确的那个... 我尝试逐步完成我的应用程序设置以使自己清楚(希望人们在发帖结束之前不会感到无聊):

我有一个会话范围的 CDI 组件作为 JSF 2.0 视图的处理程序。它包含一个实体管理器、一个对象列表和一个特殊的单个对象:

@Named
@SessionScoped
public class EventHandler implements Serializable {

  @PersistenceContext
  private EntityManager em;

  private List<MyEvent> events;

  private MyEvent currentEvent;
  ...

当视图请求列表以显示表格时,它通过查询数据库来填充列表:

Query query = em.createQuery("select e from MyEvent e");
events = (ArrayList<MyEvent>) query.getResultList();

视图在数据表中显示此内容,并提供指向处理程序中操作方法的链接:

<h:dataTable value="#{eventHandler.events}" var="_var">
  ...
    <h:commandLink action="#{eventHandler.linkAction(_var)}"> ... </h:commandLink>

action方法存储引用:

public void setCurrentEvent(MyEvent currentEvent) {
  this.currentEvent = currentEvent;
  ...

在上面的集合和引用中使用的实体中,有一个默认延迟加载的关系:

@ManyToMany(mappedBy="supportedServices")
public Set<MyEntity> getSupportingEntities() {
  ...

现在,在详细视图中并尝试通过以下方式访问此关系时:

#{eventHandler.currentEvent.supportingEntities...}

我得到一个 org.hibernate.LazyInitializationException 告诉我会话已关闭。

当处理程序是会话范围并通过查询加载引用时,处理程序是否应该能够在稍后的第二个视图中加载请求的关系?

【问题讨论】:

    标签: jsf-2 jpa-2.0 java-ee-6 cdi entitymanager


    【解决方案1】:

    嗯,我认为这是因为persistenceContext,如果它是会话范围bean的成员,则事件不是会话范围。
    第一次调用视图时,会创建持久性上下文,加载实体(事件)并填充数据表。然后持久化上下文被刷新、关闭并将响应发送到客户端。这一切都发生在同一个 http 请求中。

    但是当您随后调用详细信息视图时,会发出另一个 http 请求,并创建另一个持久性上下文,并且您对“currentEvent”的引用不再附加到最后一个持久性上下文。因此出现 LazyInitializationError(必须管理实体以延迟加载)。

    解决方案可能是:

    • 使用扩展的持久性上下文 (explained here)。
    • 渴望获取关系:

      @ManyToMany(mappedBy="supportedServices", fetch=FetchType.EAGER)

    • 在详细视图中使用它之前合并 currentEvent 的分离实例:

      entityManager.merge(currentEvent);

    【讨论】:

    • 感谢您的提示。但是无论是使用 type=PersistenceContextType.EXTENDED 还是将其再次合并到 em 中都没有完成这项工作,并且在映射中使用急切获取是没有问题的。但是我看到,如果我在操作处理程序中设置 currentEvent 时触及关系,它就会起作用。不过,我不明白为什么 em 稍后无法加载实体的一部分。
    • 由于我还没有找到其他解释,我会接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多