次のようにステートレス トランザクション サービスを使用します (つまり、呼び出しごとに新しいセッションとトランザクションを開きます)。
@Transactional
void someService(Object o) {
Object newO = entityManager.merge(o);
newO.getChildren().add(something);
}
サービスに渡すオブジェクト o は、切り離されたオブジェクトです。問題は、引数自体を永続化するのではなく、操作する新しいインスタンスmerge(object)
を返すことです。したがって、永続オブジェクトに加えた変更は、メモリ内の元のオブジェクトには反映されません。
もちろん、すべてのローカル参照を再配線することもできますが、より良い解決策があることを願っています。
新しいインスタンスを取得する代わりに、ローカル インスタンスをmanagedにする方法はありますか?
試しrefresh(object)
てみupdate(object)
ましたが、オブジェクトの関連付けがまだ切り離されているため、例外が発生します。
アソシエーションに注釈を付けると@Cascade(value=CascadeType.save-update)
正常に動作しますが、OneToMany または ManyToMany アソシエーションが多数ある場合にパフォーマンスの問題が発生しませんか?