2012-03-01 17 views
2

私はSpring 3.0.5、Hibernate 3.6.7およびVaadinを使用しています。トランザクションメソッドでセッションがバインドされていても、セッションまたはセッションが閉じられませんでした

私は私がコンテキストから取得し、その「foo」でから「バー」を表示するようになってダイアログウィンドウを持っているこの

@Entity 
public class Foo { 
    @OneToMany(fetch = FetchType.LAZY) 
    private Collection<Bar> bars; 
    ... 
} 

のような単純な実体を持っています。

@Component 
@Scope("prototype") 
public class FooBarDialogImp extends Window implements FooBarDialog { 
    @Transactional(readOnly = true) 
    public void populate(Foo foo) { 
     ... 
     for (Bar bar : foo.getBars()) { 
      // populate the dialog with bar information 
      ... 
     } 
    } 
} 

そしてときに、ユーザーがfooバーを表示するように依頼、私はこの

public class FooController { 
... 
    public void showFooBars(Foo foo) { 
     FooBarDialog dialog = context.getBean(FooBarDialog.class); 

     dialog.populate(foo); 
     showDialog(dialog); 
    } 
} 

ような何かを行うことが、問題は、私は休止状態から「ノーセッション」の例外を取得していることです。私はコードを変更してセッションファクトリを挿入し、バインドされたセッションがあるかどうかを確認しました。私は何が間違っているのか分かりません。誰でもアイデアがありますか?

答えて

8

コレクションのアソシエーションタイプをLAZYと指定したため、所有オブジェクトのゲッターメソッドが呼び出されるまでロードされません。これを行うための注意点は、セッションの範囲内にある必要があることです。セッションの範囲内にある必要があります。元のセッションまたは新しいセッションのいずれかです。また、新しいセッションを使用して遅延リストをロードすることには、エンティティがデタッチされているとみなされ、遅いコレクションを取得する前にまずmergedにする必要があります。

はそうちょうど呼び出す:

session.merge(foo); 

そのbarsを反復する前に。

+0

素晴らしい。私は、エンティティがセッションから切り離されているとは思っていませんでした。あなたの答えは、より良い解決策を見つけるために光を与えました。ありがとう:) –

関連する問題