いくつかの汚いビジネスがAMFサーブレットで起こっています...
javaからflexへのリモートオブジェクトを介して子なしでDTOのリストを取得することが想定されているDAOメソッドを呼び出しています。
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サーブレットで逆シリアル化されているときに、Hibernateがこのクラスのすべての子をロードしようとするため、セッションを開いたままにしておくと、すべての子のクエリを確認できます。したがって、このエラーを解消するための2つの修正があります。1つは1lazy="false"
対多の関係を設定すること、もう1つはAMFがすべての子の読み込みを完了するまでセッションを開いたままにすることですが、それは私が望んでいることではありません。なぜ私はすべての子供をロードすることを余儀なくされますか?
編集:わかりました、これを醜い方法で修正しました...取得したリストのクローンを作成したので、これが逆シリアル化されても、Hibernateクエリはトリガーされません。コレクションが遅延ロードされていることをLCDSに通知する方法はありますか?