残念ながら、インスタンスをアタッチしている場合、JPA の例外は回復できません。
仕様から:
3.3.2 トランザクション ロールバック トランザクション スコープと拡張永続コンテキストの両方で、トランザクション ロールバックにより、すべての既存の管理対象インスタンスと削除されたインスタンス [31] が切り離されます。インスタンスの状態は、トランザクションがロールバックされた時点でのインスタンスの状態になります。通常、トランザクションのロールバックにより、永続化コンテキストがロールバックの時点で一貫性のない状態になります。特に、バージョン属性の状態と生成された状態 (たとえば、生成された主キー) は矛盾している可能性があります。したがって、以前は永続化コンテキストによって管理されていたインスタンス (そのトランザクションで永続化された新しいインスタンスを含む) は、他の切り離されたオブジェクトと同じ方法で再利用できない場合があります。たとえば、それらはマージ操作に渡されたときに失敗する可能性があります.[32 ]
つまり、例外が発生すると、そのセッションをそれ以降のデータベース操作に使用できなくなります。
つまり、新しいセッションを作成してから、トランザクションをもう一度開始する必要があります。
Hibernate API を直接使用してトランザクションを管理する場合、Hibernate でも同じことが言えます。
12.2.3. 例外処理 Session が例外 (SQLException を含む) をスローした場合は、すぐにデータベース トランザクションをロールバックし、Session.close() を呼び出して、Session インスタンスを破棄します。Session の特定のメソッドは、セッションを一貫した状態のままにしません。Hibernate によってスローされた例外は、回復可能として扱うことはできません。最終ブロックで close() を呼び出して、セッションが閉じられることを確認します。
これを処理する 1 つの方法は、分離されたインスタンスを使用する代わりにマネージド インスタンスを使用しないことです。その場合、成功したかどうかにかかわらず、すべてのデータベース操作の後にセッションまたはエンティティ マネージャーを閉じます。
この場合、セッションを閉じると、オブジェクトは分離され、それ以降の例外はそれらに影響を与えません。
素敵な記事に出会いました