JSF UI から JPA エンティティを編集するベスト プラクティスについて、専門家の意見を聞きたいです。
それで、問題について一言。
永続化されたオブジェクトがMyEntity
あり、それをフェッチして編集するとします。私が使用するDAOレイヤーで
return em.find(MyEntity.class, id);
MyEntity
「親」エンティティのプロキシを持つインスタンスを返します-そのうちの1つがMyParent
. MyParent
へのプロキシ グリーティングとして取得されます@Access(AccessType.PROPERTY)
:
@Entity
public class MyParent {
@Id
@Access(AccessType.PROPERTY)
private Long id;
//...
}
そして MyEntity はそれへの参照を持っています:
@ManyToOne(fetch = FetchType.LAZY)
@LazyToOne(LazyToOneOption.PROXY)
private MyParent myParent;
ここまでは順調ですね。UI では、値オブジェクトを作成せずにフェッチしたオブジェクトを直接使用し、選択リストで親オブジェクトを使用します。
<h:selectOneMenu value="#{myEntity.myParent.id}" id="office">
<f:selectItems value="#{parents}"/>
</h:selectOneMenu>
すべて正常にレンダリングされ、何もLazyInitializationException
発生しません。しかし、オブジェクトを保存すると、
LazyInitializationException: could not initialize proxy - no Session
MyParent
プロキシsetId()
メソッドについて。
MyParent
関係を変更すると、問題を簡単に修正できますEAGER
@ManyToOne(fetch = FetchType.EAGER)
private MyParent myParent;
またはを使用してオブジェクトをフェッチしますleft join fetch p.myParent
(実際、それが私が今行っている方法です)。この場合、保存操作は正常に機能し、リレーションは新しいMyParent
オブジェクトに透過的に変更されます。追加のアクション (手動コピー、手動参照設定) を実行する必要はありません。非常にシンプルで便利です。
しかし。オブジェクトem.find()
が10 個の他のオブジェクトを参照している場合、10 個の追加の結合が発生します。これは、特に参照オブジェクトの状態をまったく使用しない場合、適切なデータベース操作ではありません。必要なのは、オブジェクトの状態ではなく、オブジェクトへのリンクだけです。
これは世界的な問題です。JSF スペシャリストがアプリケーションで JPA エンティティをどのように処理しているかを知りたいと思います。これは、余分な結合とLazyInitializationException
.
拡張永続コンテキストは私には適していません。
ありがとう!