0

JBoss 6.1.0.Final、JSF 2.0.3、EJB3、JPA 2 +Hibernate3.3を使用してプロジェクトに取り組んでいます。

JSFページには、エンティティAのデータを入力するためのフォームが表示されていますが、そのエンティティAに関連付けられているB、C、およびDエンティティのリストもあります。これらのリストの1つはフォームの読み込み中に表示され、もう1つはセッションがないか、セッションが閉じられたためにLazyInitializationExceptionをスローするもの。

いくつかのSOとGoogleのブラウジングの後、私はいくつかの答えとEntityManagerをビューに保持するパターンを試しましたが、それらのどれも十分ではありません。Springにはorg.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptorがあり、この状況をAFAIKで処理しているように見えますが、間違っている可能性があります。

リストにアクセスするメソッドを実行すると、例外がスローされます。

IA entityA = business.getListOfAs();// In AListBean

そして、私が行うフォームで:

entityA.getListofB(); //LazyInitializationException

Aレコードをフェッチするとすぐにリストにアクセスしません。途中にナビゲーションがあり、Bアイテムのリストをフェッチする前にセッションが閉じられます。

Aのデタッチされたインスタンスを再アタッチすると問題は解決しますが、オブジェクトをマージせずに(オブジェクトに加えられた変更を永続的に)、フェッチタイプをeagerに設定せずにそれを行う方法がわかりません。

怠惰なアプローチでAのB、C、Dエンティティのリストにアクセスする方法はありますか?

4

1 に答える 1

1

Aがセッションから切り離されている場合、Bコレクションを個別にロードし、再接続したくない場合はSetterを介して設定できます。

guiイベントを使用してコレクションにアクセスする前に、コレクションを個別にロードし、セッターを介して設定します。

HQLまたは次のような基準APIを使用して、EJBにコレクションをロードします。

public List<B> getBsByA(int aId);

JSFマネージドBeanでは、次のようなGUIイベントに接続されたプロパティと更新メソッドを使用します。

private A selectedA;
//Directly setting collection in selectedA should make this obsolete.
private List<B> bsOfSelA;

public void updateBsOfSelectedA()
{
    this.bsOfSelA = business.getBsByA(this.selectedA.getId())
    //this.selA.setBs(business.getBsByA(this.selectedA.getId()))
}
于 2012-05-22T00:38:47.230 に答える