2

次の問題は、Spring と遅延ロードです。次のサービス方法があります。

@Override
@Transactional(readOnly=true)
public List<A> getA(Long ano, Long idGt) {
    List<A> datos = ADAO.getHorariosAnoGt(ano, idGt);
    datos.size();
    C c = datos.get(0).getB().getC();
    return datos;
}

そして次のエンティティ:

A:
 B b; *(LAZY)*
 Y y;
B:
 C c; *(LAZY)*
 X x;
C:
 H h;

よし、やってみると b と c がロードされたデータは取得できなかったが、「datos.get(0).getB().getC();」データを返します。

4

2 に答える 2

2

使用できるオプションがいくつかあります

  • 特定のデータ型に熱心な読み込みを使用します。fetchType=FetchType.EAGER
  • コレクションを手動で初期化するHibernate.initialize(..)
  • フェッチプロファイルを使用して遅延読み込みと熱心な読み込みを切り替えます
  • トランザクション内の遅延コレクションのオブジェクトにアクセスします(あなたがしたことと同様です)。
for (A dato : datos) {
    dato.getB().getC();
}
于 2012-08-07T08:16:20.560 に答える
1

ああ、私は今あなたを手に入れたと思います。メソッドの外からgetA()は B と C にアクセスできませんが、できるようにしたいと思いませんか?

この理由は@Transactional、メソッドが完了するとトランザクション (そしてさらに重要なことにはセッション) が閉じられることを意味するアノテーションです。そのため、メソッド内 (したがって同じセッション内) で、遅延ロードされた関連付け (B および C) にアクセスできます。 )しかし、メソッドの外では不可能です。

Bs と Cs を利用可能にするには、@Johan Sjöberg のオプションのいずれかに従うことができます。(フェッチ タイプを永続的に変更したくない場合は、オプション 2 がおそらく最適です) または、ADAO.getHorariosAnoGt(ano, idGt)メソッド内で、使用するフェッチ モードを動的に変更することもできます: http://docs.jboss.org/hibernate/orm/3.3/reference /en/html/querycriteria.html#querycriteria-dynamicfetching

すなわちcriteria.setFetchMode("b", FetchMode.EAGER)

于 2012-08-07T09:03:48.200 に答える