看来如果你使用由hibernate代理的集合支持的selectManyCheckbox,你将遇到可怕的LazyInitializationException问题.这与支持bean的状态无关!
在调试Mojarra 2.1后,我发现如果你没有包含属性collectionType,它将尝试在进程验证阶段克隆支持值类,在我的例子中是PersistentSet.当然,为此添加任何值都会导致LazyInitializationException.
我的问题是你是否认为这是过程验证阶段的合理行为?
克隆集合类的更好算法是查看接口并从java.util实例化已知类.
小智 7
这就是重点!它与会话状态没什么关系...我遇到了这个问题,我能够通过在我的组件中添加以下内容来解决它(在我的例子中是一个selectManyMenu):
<f:attribute name="collectionType" value="java.util.ArrayList" />;
Run Code Online (Sandbox Code Playgroud)
小智 0
感谢您提示使用 h:selectMany 标记的 collectionType 属性来防止 LazyInitializationException。
然而,与其在不适当的论坛上大肆抨击这个问题,不如了解一下 JSF 2.0 中的新增功能,并发布此问题的完整示例以及如何解决它?
基础工作:
此错误的堆栈跟踪:
2013 年 2 月 4 日 1:20:50 PM 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 (抽象持久集合.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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2057 次 |
| 最近记录: |