Pertanyaannya bukan pribadi atau publik, pertanyaannya adalah: Bagaimana itu dipanggil dan implementasi AOP yang Anda gunakan!
Jika Anda menggunakan (default) Spring Proxy AOP, maka semua fungsionalitas AOP yang disediakan oleh Spring (seperti @Transational
) hanya akan diperhitungkan jika panggilan melalui proxy. - Ini biasanya terjadi jika metode beranotasi dipanggil dari yang lain kacang .
Ini memiliki dua implikasi:
- Karena metode pribadi tidak boleh dipanggil dari kacang lain (pengecualiannya adalah refleksi),
@Transactional
Anotasi mereka tidak diperhitungkan.
- Jika metode ini bersifat publik, tetapi dipanggil dari kacang yang sama, metode tersebut tidak akan diperhitungkan juga (pernyataan ini hanya benar jika (default) Spring Proxy AOP digunakan).
@Lihat Referensi Pegas: Bab 9.6 9.6 Mekanisme proksi
IMHO Anda harus menggunakan mode aspectJ, bukan Spring Proxies, yang akan mengatasi masalah. Dan Aspek Transaksional AspectJ ditenun bahkan menjadi metode pribadi (diperiksa untuk Spring 3.0).
Jawaban pertanyaan Anda adalah tidak - tidak
@Transactional
akan berpengaruh jika digunakan untuk menjelaskan metode pribadi. Generator proksi akan mengabaikannya.Ini didokumentasikan dalam Spring Manual bab 10.5.6 :
sumber
Secara default,
@Transactional
atribut hanya berfungsi saat memanggil metode beranotasi pada referensi yang diperoleh dari applicationContext.Ini akan membuka transaksi:
Ini tidak akan:
Referensi Pegas: Menggunakan @Transaksional
sumber
Ya, dimungkinkan untuk menggunakan @Transactional pada metode pribadi, tetapi seperti yang orang lain katakan ini tidak akan berhasil. Anda perlu menggunakan AspectJ. Butuh beberapa waktu untuk memikirkan cara membuatnya bekerja. Saya akan membagikan hasil saya.
Saya memilih untuk menggunakan tenun waktu kompilasi alih-alih tenun waktu karena saya pikir ini merupakan pilihan yang lebih baik secara keseluruhan. Saya juga menggunakan Java 8 sehingga Anda mungkin perlu menyesuaikan beberapa parameter.
Pertama, tambahkan dependensi untuk aspekjrt.
Kemudian tambahkan plugin AspectJ untuk melakukan tenun bytecode yang sebenarnya di Maven (ini mungkin bukan contoh minimal).
Akhirnya tambahkan ini ke kelas konfigurasi Anda
Sekarang Anda harus dapat menggunakan @Transactional pada metode pribadi.
Satu peringatan untuk pendekatan ini: Anda harus mengkonfigurasi IDE Anda untuk mengetahui AspectJ sebaliknya jika Anda menjalankan aplikasi melalui Eclipse misalnya itu mungkin tidak berfungsi. Pastikan Anda menguji terhadap Maven langsung sebagai cek kewarasan.
sumber
Jika Anda perlu membungkus metode pribadi dalam transaksi dan tidak ingin menggunakan aspectj, Anda dapat menggunakan TransactionTemplate .
sumber
TransactionTemplate
penggunaan, tetapi harap panggil metode kedua itu..RequiresTransaction
daripada..InTransaction
. Selalu beri nama benda yang ingin Anda baca setahun kemudian. Saya juga akan berpendapat untuk berpikir jika itu benar-benar memerlukan metode pribadi kedua: Entah menempatkan kontennya secara langsung dalamexecute
implementasi anonim atau jika itu menjadi berantakan itu mungkin merupakan indikasi untuk membagi implementasi menjadi layanan lain yang kemudian dapat Anda anotasi@Transactional
.Spring Documents menjelaskan hal itu
Cara lain adalah pengguna BeanSelfAware
sumber
BeanSelfAware
? Itu tidak terlihat seperti kelas SpringJawabannya adalah tidak. Silakan lihat Referensi Pegas: Menggunakan @Transaksional :
sumber
Cara yang sama seperti @loonis menyarankan untuk menggunakan TransactionTemplate seseorang dapat menggunakan komponen pembantu ini (Kotlin):
Pemakaian:
Tidak tahu apakah
TransactionTemplate
menggunakan kembali transaksi yang ada atau tidak, tetapi kode ini pasti melakukannya.sumber