Kaynaklardan birinin güncellenebileceği bir dinlenme uygulamasına sahibim.JPA birleştirme kullanırken OptimisticLockException()
updateWithRelatedEntities (String, Store): Aşağıda iki yöntem bu görevi gerçekleştirmek sorumludur kimliği ve PUT istek varlığının deserializing tarafından inşa edilen yeni nesne deposu, sürüm ayarlar aldığı (iyimser kilitleme için kullanılır) Yeni nesnede ve bir işlemde güncellemeleri çağırır.
public Store updateWithRelatedEntities(String id, Store newStore) { Store existingStore = this.get(id); newStore.setVersion(existingStore.getVersion()); em.getTransaction().begin(); newStore = super.update(id, newStore); em.getTransaction().commit(); return newStore; }
Güncelleme (String, T): bir güncelleme yapmak için genel bir yöntem. Kimliklerin eşleştiğini ve birleştirme işlemini gerçekleştirdiğini kontrol eder.
T obj = em.find(type, id);
(sürüm şimdi farklı olduğu için)merge
tetiklerken biz OptimisticLockException almak anlamına gelir veritabanında depolamak nesnenin bir güncelleştirme yapar:public T update(String id, T newObj) { if (newObj == null) { throw new EmptyPayloadException(type.getSimpleName()); } Type superclass = getClass().getGenericSuperclass(); if (superclass instanceof Class) { superclass = ((Class) superclass).getGenericSuperclass(); } Class<T> type = (Class<T>) (((ParameterizedType) superclass).getActualTypeArguments()[0]); T obj = em.find(type, id); if (!newObj.getId().equals(obj.getId())) { throw new IdMismatchException(id, newObj.getId()); } return em.merge(newObj); }
sorun bu çağrı olmasıdır.
Bu neden oluyor? Bunu başarmanın doğru yolu ne olurdu? Bence iyimser kilit sorunu çözmek hangi -
ben tür existingStore
için newStore
gelen özelliklerini kopyalamak ve birleştirme işlemi için existingStore
kullanmak istemiyoruz.
Bu kod bir uygulama sunucusunda çalışmıyor ve JTA kullanmıyorum.
DÜZENLEME: Ben güncellemeyi çağırmadan önce existingStore ayırmak durumunda bu sorunu çözer böylece , T obj = em.find(type, id);
mağaza nesnenin bir güncelleme tetiklemez. Soru hala devam ediyor - varlık ayrılmamışken neden tetikliyor?
İyimser kilitleme kavramını anlıyor musunuz? – Kayaman
Evet, kavramı anlıyorum ve neden bu hatayı alıyorum. Anlamadığım şey, JPA'nın, (çağrı) çağrılırken sürümü güncelleştirmesidir. Bu, birleştirme çağrılırken OptimistiLockException'a yönlendirir. –
'get (id)' neye benziyor? – Kayaman