【问题标题】:selectManyCheckbox LazyInitializationException on process validation流程验证时的 selectManyCheckbox LazyInitializationException
【发布时间】:2011-08-02 10:13:59
【问题描述】:

看来,如果您使用由 hibernate 代理的集合支持的 selectManyCheckbox,您将遇到可怕的 LazyInitializationException 问题。这与backing bean的状态无关!

在调试 Mojarra 2.1 之后,我发现如果不包含属性 collectionType,它将尝试在流程验证阶段克隆支持值类,在我的例子中是 PersistentSet。当然,向它添加任何值都会导致 LazyInitializationException。

我的问题是,您认为这在流程验证阶段是否合理?

克隆集合类的更好算法是查看接口并从 java.util 实例化一个已知类。

【问题讨论】:

    标签: jsf mojarra


    【解决方案1】:

    这正是重点!它与会话状态无关...... 我遇到了这个问题,我可以通过在我的组件中添加以下内容来解决它(在我的例子中是 selectManyMenu):

    <f:attribute name="collectionType" value="java.util.ArrayList" />;
    

    【讨论】:

      【解决方案2】:

      感谢您提示使用 h:selectMany 标签的 collectionType 属性来防止 LazyInitializationException。

      然而,与其在不适当的论坛上大肆宣扬它,不如学习一下 JSF 2.0 中的新功能,并发布此问题的完整示例以及如何解决它?

      基础:

      • Mojarra 2.1 是 JSF 2 参考实现(参见 What is Mojarra
      • h:selectManyCheckbox VLD 文档描述了如何使用 collectionType 属性(JSF 2.0 中的新特性)
      • 此问题会影响 h:selectManyCheckbox、h:selectManyListBox 和 h:selectManyMenu 标签的验证

      此错误的堆栈跟踪:

      2013 年 2 月 4 日下午 1:20:50 com.sun.faces.lifecycle.ProcessValidationsPhase 执行 警告:无法延迟初始化集合,没有会话或会话关闭 org.hibernate.LazyInitializationException: 延迟初始化集合失败,没有会话或会话被关闭 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383) 在 org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 在 org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122) 在 org.hibernate.collection.PersistentBag.isEmpty(PersistentBag.java:255) 在 javax.faces.component.UIInput.isEmpty(UIInput.java:1257) 在 javax.faces.component.UIInput.validateValue(UIInput.java:1144) 在 javax.faces.component.UISelectMany.validateValue(UISelectMany.java:579)

      添加collectionType 以修复此错误的示例(我正在使用自定义验证器):

      <h:selectManyListbox value="${technologyService.entity.associatedLabs}"
      collectionType="java.util.ArrayList">
      <f:validator validatorId="selectManyListboxValidator" />
      <f:attribute name="maxItems" value="5" />
      <f:selectItems value="${metadataService.activeLabSelectItems}" />
      </h:selectManyListbox>
      

      【讨论】:

        猜你喜欢
        • 2015-07-18
        • 2011-10-19
        • 1970-01-01
        • 2017-02-25
        • 2016-12-11
        • 2012-01-25
        • 2017-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多