2011-04-10 37 views
12

看起来,如果您使用由hibernate代理的set支持的selectManyCheckbox,您将遇到可怕的LazyInitializationException问题。这与支持bean的状态无关!selectManyCheckbox进程验证中的LazyInitializationException

调试Mojarra 2.1后,我发现如果不包含属性collectionType,它会尝试在流程验证阶段克隆后备值类,在我的情况下它是PersistentSet。当然,为此添加任何值都会导致LazyInitializationException。

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

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

回答

0

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

但是,而不是在一个不适当的论坛上发火焰,而不是在JSF 2.0中学习什么新东西,并发布这个问题的一个完整的例子,以及如何解决它?

基点:

  • 钻嘴鱼科2.1是JSF 2参考实现(见What is Mojarra
  • h:selectManyCheckbox VLD文档介绍了如何使用collectionType属性(新的JSF 2.0)
  • 此问题影响的验证h:selectManyCheckbox,h:selectManyListBox和h:selectManyMenu标记

堆栈此错误的跟踪:

Feb 04, 2013 1:20:50 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute WARNING: failed to lazily initialize a collection, no session or session was closed org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed 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) at org.hibernate.collection.PersistentBag.isEmpty(PersistentBag.java:255) at javax.faces.component.UIInput.isEmpty(UIInput.java:1257) at javax.faces.component.UIInput.validateValue(UIInput.java:1144) at 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> 
7

那完全点!它与会话状态没有任何关系...... 我遇到了这个问题,我能够通过在我的组件中添加以下内容(在我的情况下是selectManyMenu)来解决它:

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