Hibernate 4.1.0 が提供する Spring 3.1/JPA 2 を使用します。
基本的な監査機能 (更新タイムスタンプ、バージョン番号など) を提供するすべてのエンティティの基本クラスがあります。他のアプリケーションがデータベースにアクセスするため、これらはトリガーを介して設定する必要があります。
私のマッピングは次のようになります。
public abstract class AbstractBaseModel implements Serializable {
@Version
@Generated(GenerationTime.ALWAYS)
@Column(name = "VERSION", insertable = false, updatable = false)
protected Long version;
@Generated(GenerationTime.ALWAYS)
@Column(name = "UPDATE_TIMESTAMP", insertable = false, updatable = false)
protected Date updateDate;
...
}
このorg.hibernate.engine.internal.increment(...)
メソッドは、トランザクションをコミットするときに常に呼び出され、StaleObjectStateException
.
奇妙なことGenerationTime.NEVER
に、バージョン列を設定すると、休止状態は引き続きバージョンをインクリメントしますが、適切に持続します。問題は、データベースのバージョンが更新されない場合 (テーブルに変更がない場合など) であっても、マージから返されるバージョンがデータベースの値よりも 1 高くなり、その後の保存で明らかに問題が発生することです。
私の期待は、GenerationTime.ALWAYS
休止状態にバージョンをインクリメントしようとせず、データベースに依存してそうするように指示し、次に挿入/更新後に更新された値を選択することです。
私の理解と実装のどこが間違っているのか、誰か教えてもらえますか?