2016-03-30 40 views
1

私は私のWebAppの中に以下のエラーを取得しています:Hibernateはオプティミスティック・ロック例外

Handling an unexpected exception in webApp: - javax.servlet.error.status_code = 500 - javax.servlet.error.exception_type = class org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException - javax.servlet.error.message = Object of class [domain.entity.common.dataEntity] with identifier [110837262]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.entity.common.dataEntity

このエラーが発生した理由を、私はわからない、それが下の行で発生します。

SpecEntity specTemp = this.persistService.merge(specTemp); 

すでにによって平均時間に更新されましたentity(specTaskTemp)にmergeを呼び出すしようとしたときにそれが起こっ示して誰かが、このシナリオでは...ここHibernateOptimisticLockingFailureException例外を

答えて

5

を助けてください別の取引。

SpecEntityクラスを見る場合は、@Versionカラムを定義する必要があります。これは、マージしているエンティティがデータベース内のエンティティより古いかどうかを確認するために、休止状態によって使用されます。

サンプルフロー:

  • トランザクションT2は、バージョン値と同じSpecEntityをロードするよう

    1. トランザクションT1負荷バージョン列の値を持つSpecEntityエンティティ1.
    2. T2は、このエンティティにいくつかの変更を行い、データベースを更新するので、バージョン値は2になります。
    3. その後、T1はエンティティを更新しようとします。
    4. Hibernateは、エンティティ(つまり1)のバージョンがデータベースのvalue(2に更新されている)のバージョンと同じかどうかをチェックします。
    5. そして、それが不一致を見つけると、それはHibernateOptimisticLockingFailureExceptionを投げます。

    あなたのユースケースに応じて、データベースから更新entityをリロードするか、ユーザーが次に何をすべきかを決定できるように、ユーザーにupdated dataを示しました。

    それとも、specTaskTempエンティティ内のデータとデータベース内のデータを上書きし続けたい場合は、あなたは、データベースからこのエンティティの最新バージョンを入手specTaskTempエンティティにそのバージョン値をコピーしてmergeコールを呼び出すことができます。

  • +0

    ありがとうございました..私はGenDataEntityがSpecEntityを継承しているので、GenDataEntityでエラーをスローします。なぜ、マージがあるか、SpecEntityの同じセッションで持続している場合に起こります。データベース内のそのID-110837262で失効したオブジェクト。 – Trin

    +0

    @Teenaあなたのドメインモデルとあなたのアプリケーションの流れを見ずに答えられるかどうかはわかりません。今、問題の要点を知っているので、この例外が発生する可能性があるときは、show_SQLプロパティを有効にして、問題の原因となっているイベントの正確なシーケンスを確認できます。 –

    関連する問題