Hibernate无法初始化代理-无会话:LCD在所有集合上引发延迟加载

Hibernate无法初始化代理-无会话:LCD在所有集合上引发延迟加载,hibernate,apache-flex,lcds,Hibernate,Apache Flex,Lcds,AMF Servlet中正在发生一些肮脏的业务 我正在调用一个DAO方法,该方法用于通过从java到flex的远程对象检索DTO列表,而不包含任何子对象: public List<NivelesPlantillasDto> getList()throws HibernateException{ logger.info("getList()"); List<NivelesPlantillasDto> list = new ArrayList&

AMF Servlet中正在发生一些肮脏的业务

我正在调用一个DAO方法,该方法用于通过从java到flex的远程对象检索DTO列表,而不包含任何子对象:

public List<NivelesPlantillasDto> getList()throws HibernateException{
        logger.info("getList()");
        List<NivelesPlantillasDto> list = new ArrayList<NivelesPlantillasDto>();
        Session session = null;
        try{
            session = SessionFactory.getInstance().openSession();
            list=(List<NivelesPlantillasDto>)session.createQuery("from NivelesPlantillasDto").list();
        }catch(HibernateException HE){
            logger.info(HE.getMessage(),HE);
            if (session!=null && session.isConnected())
                session.close();
            throw HE;
        }
        if (session.isConnected())
            session.close();
        return list;
    }
public List getList()引发HibernateeException{
logger.info(“getList()”);
列表=新的ArrayList();
会话=空;
试一试{
session=SessionFactory.getInstance().openSession();
list=(list)session.createQuery(“从NivelesPlantillasDto”).list();
}捕获(冬眠异常HE){
logger.info(HE.getMessage(),HE);
if(session!=null&&session.isConnected())
session.close();
扔他;
}
if(session.isConnected())
session.close();
退货清单;
}
这是hbm.xml

<hibernate-mapping>
    <class name="architecture.dto.NivelesPlantillasDto" table="nivelesplantillas">
        <id name="pkNivelPlantilla" type="int">
            <column name="PKNIVELPLANTILLA" />
            <generator class="identity" />
        </id>
        <property name="plantilla" type="java.lang.String">
            <column name="PLANTILLA" />
        </property>
        <set name="habilidadesList" table="habilidades" inverse="true" lazy="true">
            <key foreign-key="FKNIVELESPLANTILLAS" not-null="true">
                <column name="FKNIVELESPLANTILLAS" sql-type="int"/>
            </key>
            <one-to-many class="architecture.dto.HabilidadesDto"/>
        </set>
        <set name="nivelesList" table="niveles" inverse="true" cascade="merge,delete-orphan" order-by="indice" lazy="true">
            <key foreign-key="FKNIVELESPLANTILLAS" not-null="true">
                <column name="FKNIVELESPLANTILLAS" sql-type="int"/>
            </key>
            <one-to-many class="architecture.dto.NivelesDto"/>
        </set>
        <property name="activo" type="boolean">
            <column name="ACTIVO" />
        </property>
    </class>
</hibernate-mapping>

关闭会话后会出现此错误,因为当对象在AMFServlet上反序列化时,Hibernate尝试加载该类的所有子类,我可以通过保持会话打开来查看每个子类的查询。因此,有两个修复方法可以消除此错误,一个是在一对多关系中设置
lazy=“false”
,第二个是在AMF完成加载所有子项之前保持会话打开,但这不是我想要的。为什么我要给每个孩子都装东西

编辑:好吧,我只是用一种丑陋的方式修复了这个。。。我克隆了检索到的列表,所以当这个列表被反序列化时,它不会触发任何Hibernate查询。有没有办法告诉LCD哪些集合正在被延迟加载

有没有办法告诉LCD哪些集合正在被延迟加载

据我所知没有。我认为你应该考虑实施“模式”-你的是一个合适的用例。 更新

根据OP提供的“答案”,我想指出可能有更好的方法来延迟加载和
size
操作Hibernate支持额外的惰性集合,它只对数据库发出一个
select count(…
语句,而不是加载整个集合(如果您只需要获取集合的大小)。只需添加此注释:

@LazyCollection(LazyCollectionOption.EXTRA)
详细信息请参见。

好的,我想我现在知道了。 因此,显然,当您对延迟加载的集合执行list.size()时,hibernate会加载所有子集合,并且由于集合不为null,我的最佳猜测是AMF Servlet检查集合是否为null,然后在某个点检查大小是否为0,从而触发集合的满负载。
因此,快速修复方法是遍历每个引用,查找惰性集合并将其设置为null。

我正在修复一个完全由非惰性关系构成的缓慢应用程序,有没有办法将这些绑定对象转换为不涉及克隆所有内容的常规对象?@user1601662,“将那些绑定对象转换为不涉及克隆所有内容的常规对象"-抱歉,我不明白。我的意思是,惰性集合是用代理对象检索的,有没有办法在运行时取回常规对象呢?我没有拒绝OP模式,但我有两周的时间来完成这项工作和一些新的目录,我会在一切顺利后试一试,顺便说一句,额外的惰性选项是一个完美的快速修复,thnx!另外,请注意,此解决方案仅在会话对AMF servlet开放的情况下才有效,因为它仍然会触发计数,这比加载所有内容要小。我认为有更好的方法…请参阅我更新的答案。