2012-08-31 16 views
10

Hazırda bekletme nesnesini otomatik olarak güncelleştirmekten hazırda bekletmeyi durdurmak mümkün mü?Hazırda bekletme modundayken otomatik güncelleştirmeyi devre dışı bırakma/JPA

@Transactional 
    public ResultTO updateRecord(RequestTO requestTO) { 

     Entity entity = dao.getEntityById(requestTO.getId()); 

     // now update the entity based on the data in the requestTO 

     ValidationResult validationResult = runValidation(entity); 

     if(validationResult.hasErrors()) { 
      // return ResultTO with validation errors 
     } else { 
      dao.persist(entity); 
     } 
    } 

Burada kodda böyle olur, ben, kalıcı halde olması sonra varlık içinde bazı alanları güncelleştirmek için hazırda tarafından kabul edilecek varlık almak, sonra da doğrulama için varlık geçmektedir. Doğrulama başarısız olursa, doğrulama başarılı olursa öğeyi devam ettirirseniz, udpate etmeyin.

Bu akışla ilgili temel sorun şu şekildedir: doğrulama için kullanılacak öğeyi güncellediğimden, persist() yöntemini (DAO'da) aramamın önemli değil, kayıt her zaman Hazırda bekletme, hazırda bekletme öğesinin değiştirildiğini algıladığından ve güncelleştirmeyi işaretlediği için güncelleştirilmelidir.

Aklımda tuttuğum yolu değiştirebilirim ve bu sorunu çözmek için çalışıyorum, bu yüzden geçici çözümlerle ilgilenmiyorum. Kalıcı nesneleri otomatik olarak güncelleyen hazırda bekletme özelliğini nasıl devre dışı bırakabileceğimi bilmek isterim.

Lütfen unutmayın, hazırda bekletmenin JPA uygulamasını kullanıyorum. Hazırda bekletme özel API ile ilgili hazır cevaplar benim için çalışmaz.

Hazırda bekletme yapılandırması aramayı denedim ve bu davranışı durdurmak için herhangi bir yapılandırma ayarlayabilir miyim, ancak şans yok.

Teşekkür

--edit --- Bunun için bir çözüm bulamadık, bu yüzden kullanarak bildirge işlemde olmama rağmen herhangi RuntimeException atma olmadan hareketi geri seçti:

TransactionInterceptor.currentTransactionStatus() setRollbackOnly(); Bir çekicilik gibi çalışan

.

cevap

0

Doğrulama başarısız olursa ve arayan kişinin bunu yapmasını sağladıysa bir istisna atın.

+0

sayesinde, ama im bir çözüm aramıyor söylediği gibi, ben zaten, im oto güncellenmesi devre dışı bı ki belirli bir yapılandırma için arayan o var. – lutfijd

1

Oturumunuz için FlushMode'u yapılandırın.

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

+0

Bu, temel olarak, hazırda bekletme modlarını sorgular yürütmeden önce nasıl davranacağını (eski verilerden kaçınmak için deşifre ya da değil) ilgilendiren Hazırda Bekletme API'sıdır. JPA EntityManager, floş modunu ayarlamaya izin verir, ancak aynı zamanda sorgu yönetimi ile ilgilidir. Yine de EntityManager'daki floş modunu farklı tiplere ayarlamaya çalışmam ve yine de bir fark yaratmadım. – lutfijd

+0

@user Yorumlarınız bana ait değil. Yukarıda yapıştırdığım bağlantıda açıkça belirtilmiştir "Bir temizleme stratejisini temsil eder. Yıkama işlemi, durum değişikliklerini algılayarak ve SQL deyimlerini yürüterek veritabanı durumunu oturum durumuyla eşitler." İlk olarak [link] (http://stackoverflow.com/questions/3220336/whats-the-use-of-session-flush-in-hibernate) –

+0

adresine bakın: Bu, JPA API'sini değil, Hazırda belirli bir API'dır. ikinci: JPA floş modu ayarları, JPA'nın 2 floş modu türü işleme ve otomatik olduğundan ve manuel moda sahip olmadığından beri bu davranışı etkilemez. , JPA'da otomatik güncellemelerin nasıl devre dışı bırakılacağı sorusuna dönelim çünkü sağladığınız bağlantılar JPA içeriğinde çok yardımcı olmayacaktır. – lutfijd

0

Aşağıdaki kodu çağırabilirsiniz:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 
İlgili konular