4

Seamが管理する拡張永続コンテキスト(PC)のCDI会話スコープを使用しています。これにより、PCをよりきめ細かく制御でき、LIEを回避できます。EJBBeanの代わりにCDIBeanを使用しています。ページで、エンティティのリストを取得してテーブルに表示します。テーブルから選択したエンティティレコードはフォームにバインドされ、編集できますが、[保存]ボタンがクリックされるまで保持されません。この場所で問題が発生します。すべてのエンティティが管理されているため、保存アクションで現在のエンティティを1つだけフラッシュ/コミットしようとすると、編集されたエンティティも保持されます。この種の問題に対する推奨されるベストプラクティスのアプローチは何ですか。管理対象エンティティと表示/編集されたエンティティの間で中間POJOを使用する必要がありますか?現在進行中のエンティティをデタッチしてから(保存する前に)マージする必要がありますか?助言がありますか?

JPA 2.0、Hibernate 4.x
Seam 3(溶接CDI、永続性、トランザクション、Facesモジュール)
JSF 2.1
JavaEE6。

4

3 に答える 3

3

同様のアプローチを使用しましたが、EJB3 Beanを使用し、Seam永続コンテキストを使用しませんでした。それでも、私たちの経験があなたに役立つかもしれません。

アイデアは:

  • extended PersistenceContextBeanで使用する
  • トランザクションなしですべてのメソッドを作成します-そうでない場合、エンティティは呼び出し後にコミットされます
  • saveメソッドをトランザクションのあるメソッドにします。

LazyExceptionエンティティを切り離すと、ロードされていないものにアクセスしようとするたびにスローするため、エンティティを前面に配置するメリットがなくなります。DTOを使用するのとまったく同じです。

それが役に立てば幸い!

于 2012-07-19T16:37:01.643 に答える
2

私が正しく理解していれば、次のようになります。

  1. エンティティオブジェクトはページに表示されます
  2. ユーザーはそれらのオブジェクトに変更を加えることができます
  3. ユーザーはオブジェクトを保存して、データベースに変更をコミットできます

ここでの正しいアプローチは、編集時にオブジェクトをデタッチし、保存時にオブジェクトを(マージして)再アタッチすることだと思います。これにより、保存されていない変更のみがメモリに保持されます。

リクエスト間で保持する必要のあるオブジェクトはすべてデタッチされるため、実際にはこのための拡張永続コンテキストは必要ありません。

于 2012-07-01T00:23:32.700 に答える
0

私はフロントエンドでPrimefacesを使用していますが、デフォルトでエンティティに加えられた変更をajaxが送信していました。Primefacesコンポーネントを管理した後、問題は解決しました。

于 2012-07-21T08:32:56.487 に答える