Pertama, Anda harus memahami bahwa akar masalahnya bukanlah transaksi. Kami memiliki transaksi dan konteks (sesi) yang persisten. Dengan @Transactional
anotasi Spring membuat transaksi dan membuka konteks persisten. Setelah metode dipanggil, konteks persisten menjadi tertutup.
Saat Anda memanggil user.getUserAccount()
Anda memiliki kelas proxy yang membungkus UserAccount
(jika Anda tidak memuat UserAccount
dengan User
). Jadi ketika konteks persisten ditutup, Anda memiliki LazyInitializationException
selama panggilan metode apa pun UserAccount
, misalnya user.getUserAccount().toString()
.
@Transactional
hanya bekerja pada userService
tingkat, dalam kasus Anda. Untuk mendapatkan @Transactional
bekerja, itu tidak cukup untuk menempatkan @Transactional
anotasi pada suatu metode. Anda perlu mendapatkan objek kelas dengan metode dari Spring Context
. Jadi untuk mengupdate uang bisa menggunakan metode layanan lain, misalnya updateMoney(userId, amount)
.
Jika Anda ingin menggunakan @Transactional
pada metode pengontrol Anda perlu mendapatkan pengontrol dari Spring Context
. Dan Spring harus mengerti, bahwa ia harus membungkus setiap @Transactional
metode dengan metode khusus untuk membuka dan menutup konteks persisten. Cara lain adalah dengan menggunakan pola Session Per Request Anti. Anda perlu menambahkan filter HTTP khusus.
https://vladmihalcea.com/the-open-session- in-view-anti-pattern/