0

私はEclipseLink 2.3.3を使用しています。約 100 のエンティティを持つデータ モデルを使用します。注釈を使用して各データベース テーブルにマップされた Java クラスがあります。

実装するユースケースが 2 つあります。1 つは、新しいレコードがシステムに入力され、約 60 ~ 75 のテーブルにヒットすることです。この場合、トップレベルのオブジェクトをマージして、関連するすべてのエンティティにカスケードできるように、マージと永続化をカスケードする必要があります。

もう 1 つのユース ケースは、個々のオブジェクトのコレクションを挿入する必要がある場合です。多くの場合、多数の異なるテーブルのそれぞれから 1 つです。この場合、挿入を制御する必要があるため、カスケード マージは必要ありません。カスケードを有効にしている場合、最初のオブジェクトをマージすると、それらが関連しているかどうか、またはどのように関連しているかに応じて、他のオブジェクトがマージされる場合とマージされない場合があるため、それぞれを明示的にマージしたいと思います。

したがって、本質的に、ある状況ではカスケード マージと永続化が必要ですが、別の状況ではそうではありません。したがって、マップされたクラスにカスケード アノテーションを含める場合は、特定の操作のカスケードを選択的に無効にする必要があります。または、マップされたクラスでカスケードをオフにする場合、特定の操作のカスケードを有効にしたいと考えています。

これまでのところ、特定の操作のカスケードを選択的にオンまたはオフにする方法を見つけていません。CascadePolicy クラスがありますが、それはクエリでのみ使用されるようです。動的エンティティがあり、おそらくそれを使用して、既存のエンティティから動的エンティティを作成し、そのエンティティの関係のカスケード動作をオフにして、それをマージに使用できると考えていましたが、できませんでしたそのための適切な API を見つけます。

だから、私が見落としているどこかにもっと良い答えがあるかどうか疑問に思っていますか? 情報をありがとう。

4

1 に答える 1

1

特に、個々のオブジェクトを挿入したいと言った場合は、どのレベルの制御を求めているのかわかりません。その音から、カスケード マージは、EntityManager.merge で使用する最初のケースで、Entity オブジェクト ツリーにまさに必要なものです。エンティティで呼び出された Merge は、エンティティが新しいかどうかをチェックし、必要に応じて更新または挿入します。リレーションシップをカスケード マージとしてマークすると、新しいオブジェクトを見つけて挿入することができます。

個々の挿入を処理したい 2 番目のケースでは、マッピングでカスケード永続オプションを除外し、挿入するオブジェクトで単に EntityManager.persist を呼び出してみませんか? Persist はカスケードしないため、 em.persist を呼び出すエンティティのみが挿入されます。リレーションシップは、foreignkey 値を設定するためだけに使用されますが、null のままにして、後で大きなマージ呼び出しの一部として設定することもできます。双方向の関係の両側を維持する必要があり、反対側が存在し、マージされない場合、その関係の変更は保存されません。

それが望ましくない場合、EclipseLink には UnitOfWork のネイティブ API があり (EntityManager は基本的にトランザクション作業のために UnitOfWork をラップします)、マージ ポリシーを指定できます。UnitOfWork の mergeClone、deepMergeClone、shallowMergeClone を参照してください。これらは基本的にマージ ポリシーとしてそれぞれ CASCADE_ALL_PARTS、CASCADE_PRIVATE_PARTS、NO_CASCADE を使用しますが、JPA マージは CASCADE_BY_MAPPING を使用します。

于 2012-11-14T21:54:38.367 に答える