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/