2012-03-27 2 views
0

Webアプリケーション(Tomcat 7)を作成しているので、JTAはなく、各プロジェクトに関連付けられたタスクを含むプロジェクトのリストをJSFページに表示します。JSFでエンティティを使用する

2つのエンティティ - タスクのコレクションを含むプロジェクトがあります。私のマネージドBeanから、アクティブなすべてのプロジェクトを取得し、このプロジェクトのコレクションを反復(ui:repeat)し、プロジェクトごとのタスクを表示する便利なメソッドを呼び出します。私はこれをやろうとすると、永続コンテキストがもはや有効範囲にないので、永続例外が発生します。

プロジェクトとタスクのバッキングBeanを作成しないで、拡張コンテキストを使用せずに、他にどのようなオプションがあるかを指定します。

答えて

0

もフェッチあなた便利なメソッドを持っているがたとえば、クエリ内の関連付けに参加するなどのタスクタスクがすでにロードされている場合、JPAはコレクションにアクセスするときにタスクをフェッチする必要はありません。

編集:クエリの実行の副作用として関連または要素コレクションの取り込みを可能

AがJOIN FETCH:JPA 2.0 specificationはセクション4.4.5.3に書き込みます。

参加フェッチするための構文は

fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression 

として返されるエンティティまたは埋め込みから参照される関連又は要素のコレクションでなければならないJOIN FETCH句の右側で参照アソシエーションでありますクエリの結果

FETCH JOIN句の右側で参照されるオブジェクトに識別変数を指定することはできないため、暗黙的にフェッチされたエンティティまたは要素への参照はクエリの他の場所には表示されません。

次のクエリは、一連の部門を返します。副作用として、明示的な照会結果の一部ではないにもかかわらず、それらの部門の関連従業員も検索されます。フェッチ結合の結果として取得されるオブジェクトの永続状態または関係フィールドまたはプロパティの初期化は、そのクラスのメタデータ(この例ではEmployeeエンティティ クラス)によって決まります。

SELECT d 
FROM Department d LEFT JOIN FETCH d.employees 
WHERE d.deptno = 1 

A参加フェッチ同じジョイン操作の右側に指定された関連オブジェクトがクエリ結果に返されるか、さもなければで参照されていないことを除いて、参加対応する内側または外側としてセマンティクスを参加有しますクエリ。したがって、たとえば部門1に従業員が5人いる場合、上記のクエリは部門1のエンティティへの5つの参照を返します。

FETCH JOIN構文は、サブクエリのFROM句では使用しないでください。

+0

はどのようにして、クエリを書くのでしょうか?今私のクエリは単に "SELECT p FROM project p"です。 – semiintel

+0

私の答えは、今、それは簡単です、あなたのニーズに含まれている例を適応、仕様の関連部分を含んでいます。 – meriton

+0

すごく面白かったです。答えを更新してくれてありがとう。 – semiintel

0

(工場を使用して)EntityManagerを手動で開き、トランザクションを開始してコミットし、エンティティマネージャを閉じます。

しかし、それは良いオプションではありません - (あなたはEJB3を使用しない場合)あなたのためのトランザクションやセッションを管理するためにCDIに、SeamやSpringのようなものを見てみ

1

もう少し考え、研究を重ねた後、私が抱いている状況を正しく説明し、問題を解決する方法を提供するために戻ってきました。蒸散何

は、プロジェクトエンティティがレイジーロードとして指定されたタスクの関係を有することです。 JPAは、取得するデータを要求する前にコレクションへのリクエストを待機するプロキシ・オブジェクトを使用します。これは、永続コンテキストがエンティティを切り離した後に情報にアクセスしようとしているため、問題になります。

解像度:

遅延ロードをトリガ - 永続コンテキストスコープに入れたまま、あなたがのためにデータを望むコレクションゲッターやその他のメソッドを呼び出す、これは、データを取得して、コメントを追加するトリガーエンティティ。

フェッチタイプを作成する - レイジーローディングを使用する理由を確認し、フェッチタイプをeagerに変更します。 "FetchType.EAGER"

フェッチ結合 - クエリと一緒にフェッチされるJP QLの一部としての関連付けを追加します。これにより、1つの呼び出しでロードされるクエリと関連付けが最適化され、単一のEntityだけが返されます。これは彼らの問題への解決策を見つけるために次の人を助け希望

を「p.tasksをFETCH JOINのプロジェクトのp左からPを選択」。 JPAは、関連するデータをロードするよう

関連する問題