0

いくつかの汚いビジネスが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に通知する方法はありますか?

4

2 に答える 2

0

コレクションが遅延ロードされていることをLCDSに通知する方法はありますか?

私が知っていることではありません。「 OpenSessioninView」パターンの実装を検討する必要があると思います。そのための適切なユースケースはあなたのものです。

アップデート

OPによって提供された「回答」に基づいて、遅延読み込みと操作へのより良いアプローチがあるかもしれないことを指摘したいと思いsizeます。Hibernateはselect count(...、必要なのがコレクションのサイズを取得することだけである場合にコレクション全体をロードするのではなく、データベースに対してステートメントを発行するだけの非常に遅延したコレクションをサポートします。この注釈を追加するだけです:

@LazyCollection(LazyCollectionOption.EXTRA)

詳細については、 http://www.frightanic.com/2010/11/21/extra-lazy-one-to-many-mapping-with-hibernate/を参照してください。

于 2013-01-17T19:53:20.120 に答える
0

OK、私は今それを手に入れたと思います。したがって、遅延ロードされたコレクションでlist.size()を実行すると、hibernateはすべての子をロードし、コレクションがnullではないため、AMFサーブレットがコレクションがnullかどうか、次にサイズがチェックされると推測されます。ある時点で0であり、コレクションの完全なロードをトリガーします。したがって、簡単な修正は、すべての参照を繰り返して、遅延コレクションを探し、それらをnullに設定することでした。

于 2013-01-19T06:00:57.817 に答える