Hibernate RESTORE_视图中的LazyInitializationException(不正确的PersistentSet实例化)

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,在尝试拖放支持时遇到了一个问题

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>