@Transactional, Spring Data ile nasıl kullanılır?


82

Spring-data, Hibernate, MySQL, JPA projesi üzerinde çalışmaya yeni başladım. El ile sorgu oluşturma konusunda endişelenmeme gerek kalmaması için bahar verilerine geçtim.

@TransactionalSorgularımı ek açıklama olmadan da denediğim için, yay verilerini kullanırken kullanımının gerekli olmadığını fark ettim .

@TransactionalEk açıklamayı kullanmam / kullanmamam için belirli bir neden var mı ?

İşler:

@Transactional
public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

Ayrıca çalışır:

public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

Şimdiden teşekkürler!

Yanıtlar:


141

Sorunuz gerçekte ne hakkında? @RepositoryEk açıklamanın kullanımı veya @Transactional.

@RepositoryBildirdiğiniz arayüz, Spring Data altyapısının oluşturduğu ve yine de istisna çevirisini etkinleştiren bir proxy tarafından destekleneceğinden, hiç gerekli değildir. Dolayısıyla, bu ek açıklamayı Spring Data veri havuzu arayüzünde kullanmanın hiçbir etkisi yoktur.

@Transactional- JPA modülü için, proxy ( SimpleJpaRepository) 'yi destekleyen uygulama sınıfında bu ek açıklamaya sahibiz . Bunun iki nedeni vardır: Birincisi, nesnelerin kalıcı hale getirilmesi ve silinmesi JPA'da bir işlem gerektirir. Bu nedenle, yöntemin açıklamasını alarak yaptığımız bir işlemin çalıştığından emin olmalıyız @Transactional.

Kesinlikle gerekli olmayan ancak işlem altyapısında birkaç optimizasyonu tetikleyen gibi findAll()ve findOne(…)kullanılıyor gibi okuma yöntemleri @Transactional(readOnly = true)( kalıcılık sağlayıcılarının kapatırken kirli denetimleri atlamasına izin FlushModeverecek MANUALşekilde ayarlanması EntityManager). Bunun ötesinde bayrak, JDBC Bağlantısında da ayarlanır ve bu, o düzeyde daha fazla optimizasyona neden olur.

Hangi veritabanını kullandığınıza bağlı olarak, tablo kilitlerini atlayabilir veya yanlışlıkla tetikleyebileceğiniz yazma işlemlerini reddedebilir. Bu nedenle @Transactional(readOnly = true), bilgi havuzu arayüzünüze ek açıklamayı kolayca ekleyebileceğiniz sorgu yöntemlerini kullanmanızı öneririz . @TransactionalBu arayüzde beyan etmiş veya yeniden dekore etmiş olabileceğiniz manipüle etme yöntemlerine bir düzlük eklediğinizden emin olun .


9
Kısacası: Tüm DAO yöntemlerimde sorgu ekleme / düzenleme / silme işlemlerinde @Transaction (readOnly = true) seçmeli sorgularda @Transactional kullanmalı mıyım?
Byron Voorbach

21
Kesinlikle. Bunu yapmanın en kolay yolu @Transactional(readOnly = true), arayüzü kullanmaktır (genellikle bulucu yöntemleri içerdiğinden) ve bu ayarı değiştiren her sorgu yöntemi için düz bir şekilde geçersiz kılmaktır @Transactional. Aslında bu şekilde yapılır SimpleJpaRepositoy.
Oliver Drotbohm

Kapsamlı açıklama için @Oliver teşekkürler .. Ama diğer bağlantılardan geçerken [işlem-çukur düşmeleri] < ibm.com/developerworks/java/library/j-ts1/index.html#listing8 >. " Sonuç olarak, ORM tabanlı bir çerçeve kullandığınızda, salt okunur bayrağın oldukça yararsız olduğu ve çoğu durumda göz ardı edildiği " yazıyor . Ancak yine de kullanmakta ısrar ediyorsanız, yayılma modunu her zaman DESTEKLER olarak ayarlayın " . .Bunu okuduktan sonra, tek başına (readOnly = true) kullanmam gerekip gerekmediğinden emin değilim .. DESTEKLER olarak her zaman yayılma modunda kullanılmalı mıdır.
Anupam Gupta

9
Makalenin bu bölümünde her şeye yakın yanlış. Yazmadığınızı belirterek, JDBC güdümlü, DB etkileşimleri için performansı artırabilir (sağlayacaktır). Ayrıca yanlışlıkla verilen yazıları da algılayabilir ve reddedebilir. Bunun da ötesinde Spring, salt okunur modda JPA / Hazırda bekletmeyi devre dışı bırakır; bu, sağlayıcının daha sonra kirli kontroller yapması gerekmediğinden, büyük nesne grafiklerini okumanız durumunda performansı büyük ölçüde etkileyebilir. Bayrağın işlemin kendisi üzerinde büyük bir etkisi olmayabilir, ancak bu, dikkate alınması gereken her şey değil.
Oliver Drotbohm

Büyük nesne grafikleri veya çok sayıda yönetilen nesnenin yüklendiği kullanım durumlarında performans iyileştirmeleri için kefil olabilirim.
Shailendra

3

Sorunun biraz daha geniş olduğunu ve veri erişim katmanındaki ek açıklamalarda azaltılamayacağını düşünüyorum. Uygulamanın tüm yığınını, uygulamak istediğimiz işlem stratejilerini vb. Dikkate almamız gerekir. IBM developerworks sitesinde Mark Richards'ın bu konuyla ilgili çok kapsamlı bir makale seti var. İlkini burada bulabilirsiniz: https://developer.ibm.com/articles/j-ts1/

Saygılarımla


2

@RepositoryEk açıklama kullanmalısınız

Bunun nedeni @Repository, denetlenmemiş SQL istisnanızı Spring Excpetion'a çevirmek için kullanılmasıdır ve ilgilenmeniz gereken tek istisnaDataAccessException


10
Bu genel olarak Spring kullanılırken doğrudur, ancak Spring Data depoları zaten bir Spring proxy tarafından desteklendiğinden, @Repository kullanılması herhangi bir fark yaratmaz.
Aleksander Blomskøld

0

Kaydı kilitlemek için @Transactional annotation'ı da kullanırız, böylece başka bir iş parçacığı / istek okumayı değiştirmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.