2017-11-29 5 views
0

私はlazy="extra"属性の1対多コレクションを持っています。トランザクション外の余分な遅延コレクションのサイズ()の取得

Class Foo { 
    List<Bar> barList; 
} 

上記のクラスコレクションを含むlazy="false"初期化クラスがあります。

Class FooContainer { 
    List<Foo> fooList; 
} 

私はサービスとFooContainerエンティティを取得するので、私はトランザクションの外に.size()を使用する必要があります。

FooContainer fc = serviceImpl.getFCById(fooContainerId); 

このようにfc.getFooList()が初期化されます。それから私はbarListのサイズだけを取得する必要があります。コレクション全体を取得する必要はありません。

for(Foo currentItem: fc.getFooList()) { 
    int barSize = currentItem.getBarList().size(); 
} 

これは、LazyInitializationExceptionが表示される場合です。 このメソッドを呼び出そうとしました。

@Transactional 
Class AnotherServiceImpl { 
    int getBarListSize(Foo foo){ 
     return foo.getBarList().size(); 
    } 
} 

セッションがないために動作しませんでした。 getHibernateTemplate().getCurrentSession.initialize(foo.getBarList())AnotherServiceImplに入れることはできますが、これはうまくいきますが、おそらくすべての項目を取得することになりますが、これは受け入れられません。

フェッチせずにコレクションサイズを取得する方法はありますか?コメントMethod where I get FooContainer fc and call .size() is the same method and it is not @Transactionalと一緒

+0

関連:https://stackoverflow.com/questions/2198528/hibernate-hql-get-count-of-results-without-actually-returning-them – Moira

+1

私はそれが管理されているエンティティの問題ですか疑います。 FooContainerとgetBarListSize呼び出しメソッドの作成にTransaction-Propagationが使用されるものを追加する必要があります。 – aschoerk

+0

@aschoerk 'ServiceImpl'と' AnotherServiceImpl'にはデフォルトの伝播があります。 'FooContainer fc'を取得し、' .size() 'を呼び出すメソッドは同じメソッドであり、' @ Transactional'ではありません。 – Nalmelune

答えて

0

FooContainerがあるためにコミットされたトランザクションの返されるので、「余分な」-lazyコレクションが解決得ることができないとき、エンティティは、アンマネージ得ます。呼び出し元のメソッドがTransactionalであっても機能します。

あなたはあなたができる、私が見る次のオプションがあります。

  1. は、呼び出し元のメソッドは、デフォルトの伝播
  2. でトランザクションまたはそれが再び管理するためにgetBarListSizeで有効なHibernateセッションにFOOをマージします。
  3. また、FooのbarListをLazy(false)にすると、FooContainerのロード中にすべてがフェッチされます。 (しかしそれは受け入れられないようです)
  4. またはグループごとのステートメントを使用してサイズを取得します。
関連する問題