2017-01-10 10 views
1

私は私のDALに今JPA - EntityGraphとHibernateのL2キャッシュ(ehcacheを)

@Cacheable 
@Entity 
@NamedEntityGraph(
    name = "Parent.Child", 
    attributeNodes = { 
     @NamedAttributeNode("children"), 
    } 
) 
public class Parent { 
    private Set<Child> children; 
    // getter - setter 
} 

以下のように定義1対多の関係を持って、私は

@Override 
    public Parent getParentWithChildren(int id) { 
     EntityGraph<?> graph = entityManager.getEntityGraph("Parent.Child"); 
     Map<String, Object> props = new HashMap<>(); 
     props.put("javax.persistence.fetchgraph", graph); 
     return entityManager.find(Parent.class, id, props); 
    } 

このメソッドを呼び出しています私はParentにChildrenをロードしているので、子供のコレクションはトランザクション外で使用できるはずです。しかし、私はレイジー初期化の例外を得ています。これは、hibernate level 2 cache-ehcacheが有効な場合にのみ発生します。私は設定から​​それを無効にすると、期待どおりに動作します。また、の後にコレクションを明示的に初期化すると、が見つかると、期待通りに動作します。バグですか?私はJPA 2.1でHibernate 5.2.6.Finalを使用しています。

編集:私は気づいたもう一つは、その問題が休止状態&キャッシュプロバイダと関連していなければならないので、エンティティは、初めての罰金ロードということでした。

+0

同様の状況が発生します。私はL2キャッシュを使用しません。エンティティがすでに永続コンテキストにある場合、fetchgraphヒントを持つ次のem.findはデータベースから何もロードしません。それはバグとしても私には思われます。 – srnjak

+0

セッションキャッシュについても同じことが起こると思います。これは確認されたバグであり、5.2.10で解決されたとマークされています – user2578525

答えて

0

いいえこれはバグではありません。私は、Hibernateがキャッシュからのロードを本当に必要になるまで遅らせると思います。あなたが熱心なフェッチを要求しない限り、実装は妥当であると見なして怠惰であると決めることができます。

一般的なルールは、(正確にはHibernateセッションを閉じる前に)トランザクションから出る前に必要なものすべてをロードすることです。

+0

私はすでに子どもコレクションを積極的に読み込むためにフェッチグラフを使用しています – user2578525

+0

私はそれを証明するのに十分な情報を与えていませんが、コレクションのオブジェクトが遅れて読み込まれるようにプロキシされています。 – Henri

+1

propsオブジェクトを参照してください。 Imフェッチグラフを指定する – user2578525

関連する問題