Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

LazyInitializationException mencoba mendapatkan instance yang diinisialisasi malas

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/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan baris sebelum dan sesudah kueri

  2. Bisakah Aplikasi Android terhubung langsung ke database mysql online

  3. Pilih N baris terakhir dari MySQL

  4. INDIA, Skrip Pencari Kode STD di PHP, MYSQL, JQUERY

  5. Praktik terbaik untuk bendera bit di PHP