Hibernate RESTORE_视图中的LazyInitializationException(不正确的PersistentSet实例化)
我刚开始使用IceFaces,在尝试拖放支持时遇到了一个问题Hibernate RESTORE_视图中的LazyInitializationException(不正确的PersistentSet实例化),hibernate,jsf,jpa,drag-and-drop,icefaces,Hibernate,Jsf,Jpa,Drag And Drop,Icefaces,我刚开始使用IceFaces,在尝试拖放支持时遇到了一个问题 IceFaces 2.0.0 JSF 2.0 Mojarra 2.0.2 (FCS b10) (JSF reference implementation) Spring 3.0.3 Hibernate 3.5.1-Final JPA 2.0 (with OpenEntityManagerInViewFilter) 问题是在删除时出现了LazyInitializationException。我的第一个结论是不正确的持久性上下文生命周期
IceFaces 2.0.0
JSF 2.0
Mojarra 2.0.2 (FCS b10) (JSF reference implementation)
Spring 3.0.3
Hibernate 3.5.1-Final
JPA 2.0 (with OpenEntityManagerInViewFilter)
问题是在删除时出现了LazyInitializationException
。我的第一个结论是不正确的持久性上下文生命周期管理设置,但在玩了几个小时的设置、依赖项和调试之后,我发现了一件奇怪的事情:JSF
实现正在使用默认构造函数通过反射创建PersistentSet
实例(!)在RESTORE\u视图阶段
并尝试向其添加值。此操作导致LazyInitializationException
,因为PersistentSet
创建为一个简单的集合,如ArrayList
,但未正确配置(会话未设置)
此JSF实现库代码包含一个问题:
(javax/faces/component/UIComponentBase.java:1566-1591):
请告诉我一些解决方法或指出我的错误,请=)我在primefaces上遇到了类似的问题p:selectManyCheckbox组件。 也许不完全是您的情况,但是添加f:attribute name=“collectionType”组件可以解决问题
<p:selectManyCheckbox value="#{offerEditBean.selectedFloors}" converter="ait.entity.converter" layout="pageDirection">
<f:attribute name="collectionType" value="java.util.HashSet" />
<f:selectItems value="#{offerEditBean.floors}" var="item" itemValue="#{item}" itemLabel="#{item.name}" />
</p:selectManyCheckbox>
仅供参考:实例变量selectedFloors已从entities@OneToMany集合属性初始化
所以,回答你的问题,这主要是一个JSF问题
我在这里找到了这个解决方案这确实是个奇怪的问题。但是我从来没有用过JSF。我认为当使用急切的集合时,hibernate不应该创建它的集合。你能检查一下吗?我又检查过了。它应该=)在这两种情况下都创建了PersistentSet。的可能重复项
if (stateObj instanceof List) {
List<StateHolderSaver> stateList = (List<StateHolderSaver>) stateObj;
Collection<Object> retCollection = null;
StateHolderSaver collectionSaver = stateList.get(0);
Class collectionClass = (Class) collectionSaver.restore(context);
try {
retCollection = (Collection<Object>) collectionClass.newInstance(); //(*)
}
catch (Exception e) {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, e.toString(), e);
}
throw new IllegalStateException("Unknown object type");
}
for (int i = 1, len = stateList.size(); i < len; i++) {
try {
retCollection.add(stateList.get(i).restore(context)); //(**)
} catch (ClassCastException cce) {
if (LOGGER.isLoggable(Level.SEVERE)) {
LOGGER.log(Level.SEVERE, cce.toString(), cce);
}
throw new IllegalStateException("Unknown object type");
}
}
result = retCollection;
}
http://www.icefaces.org/JForum/posts/list/18539.page
http://forums.oracle.com/forums/thread.jspa?messageID=9328036
<p:selectManyCheckbox value="#{offerEditBean.selectedFloors}" converter="ait.entity.converter" layout="pageDirection">
<f:attribute name="collectionType" value="java.util.HashSet" />
<f:selectItems value="#{offerEditBean.floors}" var="item" itemValue="#{item}" itemLabel="#{item.name}" />
</p:selectManyCheckbox>