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;
}
这是 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>
关闭会话后出现此错误,因为当对象在 AMF Servlet 上反序列化时,Hibernate 尝试加载此类的所有子级,我可以通过保持会话打开来查看每个子级的查询。因此,有 2 个修复程序可以消除此错误,一个是设置lazy="false"
一对多关系,第二个是让会话保持打开状态,直到 AMF 完成加载所有子项,但这不是我想要的。为什么我被迫加载每个孩子?
编辑:好的,我只是以一种丑陋的方式解决了这个问题......我对检索到的列表进行了克隆,所以当这个列表被反序列化时,它不会触发任何 Hibernate 查询。有没有办法告诉 LCDS 哪些集合被延迟加载?