Jsf 在流程验证时选择ManyCheckBox LazyInitializationException

Jsf 在流程验证时选择ManyCheckBox LazyInitializationException,jsf,mojarra,Jsf,Mojarra,如果您使用由hibernate代理的集合支持的selectManyCheckbox,您将遇到可怕的LazyInitializationException问题。这与支持bean的状态无关 在调试Mojarra 2.1之后,我发现如果不包括属性collectionType,它将在流程验证阶段尝试克隆支持值类,在我的例子中是PersistentSet。当然,添加任何值都会导致LazyInitializationException 我的问题是,您是否认为这是流程验证阶段的合理行为 克隆collectio

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

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

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


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

感谢您提示为h:selectMany标记使用collectionType属性以防止LazyInitializationException

然而,与其在一个不合适的论坛上谈论这个问题,不如学习一下JSF2.0中的新功能,并发布一个关于这个问题的完整示例以及如何解决它

基础工作:

  • Mojarra2.1是JSF2参考实现(请参阅)
  • 文档描述了如何使用collectionType属性(JSF2.0中新增)
  • 此问题会影响h:selectManyCheckbox、h:SelectManyList Box和h:selectManyMenu标记的验证
此错误的堆栈跟踪:

2013年2月4日下午1:20:50 com.sun.faces.lifecycle.ProcessValidationsPhase执行 警告:未能延迟初始化集合,未关闭任何会话或会话 org.hibernate.LazyInitializationException:未能延迟初始化集合,未关闭任何会话或会话 位于org.hibernate.collection.AbstractPersistentCollection.ThrowlazyiInitializationException(AbstractPersistentCollection.java:383) 位于org.hibernate.collection.AbstractPersistentCollection.ThrowlazyiInitializationExceptionInNotConnected(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以修复此错误的示例(我正在使用自定义验证器):


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

<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>
<f:attribute name="collectionType" value="java.util.ArrayList" />;