次の問題に直面しており、適切な解決策が見つかりません。属性 id、x (外部キー)、y (シーケンス番号)、および z (コンテンツ) を持つ関係 A があります。さらに、xy には一意性制約があります。つまり、通常、(455, 159, 1, ...)、(456, 159, 2, ...)、(457, 159, 3, ...) などのタプルがあります。Hibernate を使用していますこれは、特定のクラスのマッピング テーブルです。ここで、新しいオブジェクトを挿入するか、既存のオブジェクトを削除して他のオブジェクトのシーケンス番号を更新するユースケースがあります。たとえば、1 の直後に新しいオブジェクトを挿入すると、シーケンス番号 2 が取得され、その後、以前は 2 だったオブジェクトが 3 になり、3 が 4 になるなどです。オブジェクト 2 (古い 3) を削除すると、同様のことが起こるはずです。その後、2などになります。
ただし、更新がトリガーされると ConstraintViolationException が発生します。
SEVERE: Could not synchronize database state with session
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
...
Caused by: java.sql.BatchUpdateException: Duplicate entry '159-2' for key 2
なぜこれが起こるのか、私にはうまく説明できません。コミット/セッション フラッシュがないため、Hibernate/MySQL は一時的な不一致を処理でき、コミットの制約をチェックします。欠けているものはありますか、それとも主要な回避策なしにこれを行う方法は本当にありませんか?
乾杯