selectManyCheckbox LazyInitializationException进程验证

时间:2011-04-10 09:36:19

标签: jsf mojarra

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

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

我的问题是你是否认为这是过程验证阶段的合理行为?

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

2 个答案:

答案 0 :(得分:7)

这就是重点!会议状态没有任何内容...... 我遇到了这个问题,我可以通过在我的组件中添加以下内容来解决它(在我的例子中是一个selectManyMenu):

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

答案 1 :(得分:0)

感谢提示为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:懒得初始化集合,没有会话或会话被关闭       at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)       at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)       at 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>