2016-03-30 18 views
1

benim WebApp aşağıda hatayı alıyorum:hazırda İyimser Kilitleme İstisna

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

Bu hata ortaya neden emin değilim ve aşağıda doğrultusunda gerçekleşir.

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

birisi burada yardım edebilir .. Bu senaryoda

cevap

5

, zaten tarafından arada güncellendi Bir entity (specTaskTemp) üzerine merge aramaya çalıştığımızda bu gerçekleşti gösterir şekilde HibernateOptimisticLockingFailureException istisna Başka bir işlem.

SpecEntity sınıfına bakarsanız, @Version sütununu tanımlamış olmanız gerekir. Bu, birleştirdiğiniz varlığın veritabanındaki dosyadan daha eski olup olmadığını kontrol etmek için hazırda bekletme tarafından kullanılır.

akış

Örnek:

  1. İşlem T1 yükleri
  2. İşlem T2 sürüm değeri 1.
  3. T2 aynı SpecEntity yükler olarak sürümü, kolon değerine sahiptir SpecEntity işletme kılan bu varlık için bazı değişiklikler ve veritabanını güncelleştirir ve sürüm değeri 2 olur.
  4. Daha sonra T1, varlığı güncellemeye çalışır.
  5. Varlıktaki (yani, 1) sürümün veritabanındaki değerle aynı olup olmadığını (2'ye güncellenen) hazırda bekletme.
  6. Ve uyumsuzluğu bulduğunda, HibernateOptimisticLockingFailureException'u atar. bu kullanıcı bundan sonra ne karar böylece

kullanımı durumda bağlı olarak, kullanıcıya updated data veritabanından güncellenmiş entity yeniden yüklemek ve gösterebilir ya.

Yoksa specTaskTemp varlık verilerle veritabanındaki verilerin üzerine yazarak devam etmek istiyorsanız, sen veritabanından bu varlığın son sürümünü almak specTaskTemp varlığa onun sürüm değerini kopyalayıp sonra merge çağrıyı çağırabileceği .

+0

Teşekkürler .. Nasıl birşeyler bilmek istedim .. GenDataEntity, SpecEntity'yi genişlettikçe neden GenDataEntity'de hata atar .. SpecEntity için aynı oturumda birleştirme veya kalıcılık varsa bu olur mu? Veritabanındaki ID-110837262 ile eski nesneyi .. – Trin

+0

@Teena Eğer etki alanı modelinize ve uygulamanızın akışına bakmadan bunu cevaplayabileceğime emin değilim. Artık sorunun ne zaman olduğunu ve bu istisnanın olabileceğini bildiğinize göre, show_SQL özelliğini etkinleştirebilir ve olayların tam olarak hangi dizinin soruna neden olduğunu görebilirsiniz. –