2011-07-26 7 views
1

私は非常に基本的な点を欠場する恐れがありますが、私は現時点で立ち往生しています。エンティティからのコレクションを遅延ロード中の例外

JSF用のハンドラとして機能するセッションスコープのCDIコンポーネントがあります(私はセッションスコープのCDIコンポーネントをJSFのハンドラとして提供しています) 2.0ビュー。これは、エンティティ・マネージャ、オブジェクトのリストと特別単一のオブジェクトを保持している:

@Named 
@SessionScoped 
public class EventHandler implements Serializable { 

    @PersistenceContext 
    private EntityManager em; 

    private List<MyEvent> events; 

    private MyEvent currentEvent; 
    ... 

ビュー表を表示するためのリストを要求すると、それはデータベースを照会することによって、リストを埋める:

Query query = em.createQuery("select e from MyEvent e"); 
events = (ArrayList<MyEvent>) query.getResultList(); 

ビューは、データテーブルでこれを示しており、ハンドラ内のアクションメソッドへのリンクを提供する:

<h:dataTable value="#{eventHandler.events}" var="_var"> 
    ... 
    <h:commandLink action="#{eventHandler.linkAction(_var)}"> ... </h:commandLink> 

アクションメソッドが参照を格納:

収集および上記文献で使用されるエンティティ内
public void setCurrentEvent(MyEvent currentEvent) { 
    this.currentEvent = currentEvent; 
    ... 

、デフォルトでレイジーにロードされるthere'a関係:今

@ManyToMany(mappedBy="supportedServices") 
public Set<MyEntity> getSupportingEntities() { 
    ... 

、詳細ビューにあるとすることにより、この関係にアクセスしようとしたとき

#{eventHandler.currentEvent.supportingEntities...} 

セッションがクローズされていることを通知するorg.hibernate.LazyInitializationExceptionが表示されます。

2番目のビューの後の時点でハンドラが要求された関係をロードできない場合、ハンドラがセッションスコープでクエリを介して参照をロードする必要がありますか?

答えて

1

Hum。セッションスコープBeanのメンバである場合、persistenceContextイベントがセッションスコープではないためです。
ビューが最初に呼び出されると、永続コンテキストが作成され、エンティティ(イベント)がロードされ、データテーブルにデータが読み込まれます。次に、永続コンテキストがフラッシュされ、閉じられ、応答がクライアントに送信されます。これはすべて同じhttp要求で行われます。

詳細ビューを呼び出すと、別のhttp要求が発行され、別の永続コンテキストが作成され、 "currentEvent"への参照は最後の永続コンテキストに関連付けられなくなります。したがって、LazyInitializationError(エンティティは遅延ロードに管理する必要があります)。

ソリューションは次のようになります。

  • は拡張永続コンテキスト(explained here)を使用します。
  • 熱心な関係をフェッチ:

    @ManyToMany(mappedBy="supportedServices", fetch=FetchType.EAGER)

  • が詳細にそれを使用する前に、currentEventの分離されたインスタンスをマージビュー:ヒントについて

    entityManager.merge(currentEvent);

+0

感謝を。しかし、type = PersistenceContextType.EXTENDEDもemに再度マージしても、仕事をしなかったし、マッピングのeager fetchingを使うことは問題になりません。しかし、私は、アクションハンドラでcurrentEventを設定しながら関係に触れると、動作することがわかりました。それでも、後でエンティティの一部を読み込めない理由を理解できません。 –

+0

まだ別の説明が見つかりませんでしたので、私はあなたの答えを受け入れます。 –

関連する問題