1

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休止状態にバージョンをインクリメントしようとせず、データベースに依存してそうするように指示し、次に挿入/更新後に更新された値を選択することです。

私の理解と実装のどこが間違っているのか、誰か教えてもらえますか?

4

2 に答える 2

0

あなたの実際の質問に対する答えはありませんが、あなたの問題に対する解決策はあります。:)

Hibernate では、これを行うことは完全に有効です。

@Version
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "UPDATE_TIMESTAMP"
private Date updateDate;

これにより、更新日もバージョンになります。これは無駄がなく、エンティティのマージごとに自動的に更新されます。

ところで、メンバーを非公開にして、クラスにgetters とters を追加することをお勧めします。set

于 2012-04-18T09:11:20.740 に答える