1

このようなエラーが発生していました

同じ識別子の値を持つ別のオブジェクトが、すでにセッションに関連付けられています:

私が検索したところCascadeType.MERGE、多くのコードを修正またはリファクタリングして、同じデータベース オブジェクトがセッション内で 2 つのインスタンスになるのを防ぐことができることがわかりました。

私はそれをリファクタリングすることはできません。

CascadeType.MERGE動作しましたが、それは削除の問題を解決するために多くのコードを作成する必要があることを意味します.ALL。以前のことですよね?

私はそれを入れて動作させました

@Transactional(propagation = Propagation.REQUIRES_NEW)

で注釈が付けられたクラスのメソッドの上に@Service、そのクエリデータベースがあり、私が言及した例外をスローしていたものでした。

この新しい注釈付きメソッドが、現在のような将来の頭痛の種になるかどうかを理解する助けが必要です。

私が修正しているアクションの横にあるいくつかのcronジョブから呼び出されています。

4

2 に答える 2

1

あなたがリストした解決策はどれも容認できるIMHOではありません。

処理の一部を新しいトランザクションに延期すると、作業単位の原子性 (すべてかゼロか) が壊れます。また、カスケード タイプを変更すると、以前に自動的にカスケードされたすべての操作を手動で処理する必要があります。

正しいアプローチは、hibernate が同じ識別子を持つ 2 つの異なるオブジェクト インスタンスに遭遇する理由を理解することです。最も一般的な原因は、セッションに既に存在している固定識別子を持つ切り離された/一時的なオブジェクトを手動で永続化 (保存) するためです (管理された同じ識別子を持つオブジェクトはすでにセッションに存在します)。

問題の原因となっているデタッチされたオブジェクト インスタンスを手動で再アタッチ (マージ / 更新 /saveOrUpdate) してみてください。

ここで何が起こるかを正しく理解するには、エンティティのライフサイクルを認識する必要があります。

于 2017-06-21T12:42:05.383 に答える