感谢您提示使用 h:selectMany 标记的 collectionType 属性来防止 LazyInitializationException。
但是,与其在不适当的论坛上大肆宣扬它,不如学习 JSF 2.0 中的新功能,并发布此问题的完整示例以及如何解决它?
基础:
- Mojarra 2.1 是 JSF 2 参考实现(请参阅什么是 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.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375) 的 org.hibernate.collection.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>