Saya cenderung menggunakan Hibernate dalam kombinasi dengan kerangka kerja Spring dan kemampuan demarkasi transaksi deklaratifnya (misalnya, @Transactional ).
Seperti yang kita semua ketahui, hibernasi berusaha menjadi non-invasif dan setransparan mungkin, namun ini terbukti sedikit lebih menantang saat menggunakan lazy-loaded
hubungan.
Saya melihat sejumlah alternatif desain dengan tingkat transparansi berbeda.
- Jadikan hubungan tidak lambat (mis.,
fetchType=FetchType.EAGER)
- Ini membatalkan keseluruhan gagasan pemuatan lambat ..
- Inisialisasi koleksi menggunakan
Hibernate.initialize(proxyObj);
- Ini menyiratkan kopling yang relatif tinggi ke DAO
- Meskipun kita bisa mendefinisikan antarmuka dengan
initialize
, implementasi lain tidak dijamin akan memberikan yang setara.
- Tambahkan perilaku transaksi ke
Model
objek persisten itu sendiri (menggunakan proxy dinamis atau@Transactional
)- Saya belum mencoba pendekatan proxy dinamis, meskipun saya sepertinya tidak pernah mendapatkan @Transactional mengerjakan objek persisten itu sendiri. Mungkin karena hibernasi itu adalah operasi pada proxy yang akan digunakan.
- Kehilangan kendali saat transaksi benar-benar terjadi
- Sediakan API lazy / non-lazy, misalnya,
loadData()
danloadDataWithDeps()
- Memaksa aplikasi untuk mengetahui kapan harus menggunakan rutin yang mana, lagi kopling yang ketat
- Metode overflow
loadDataWithA()
, ....,loadDataWithX()
- Paksa pencarian dependensi, misalnya dengan hanya menyediakan
byId()
operasi- Membutuhkan banyak rutinitas yang berorientasi non-objek, misalnya,
findZzzById(zid)
dan kemudiangetYyyIds(zid)
bukannyaz.getY()
- Akan berguna untuk mengambil setiap objek dalam koleksi satu per satu jika ada overhead pemrosesan yang besar di antara transaksi.
- Membutuhkan banyak rutinitas yang berorientasi non-objek, misalnya,
- Jadikan bagian dari aplikasi @Transactional, bukan hanya DAO
- Pertimbangan yang mungkin untuk transaksi bersarang
- Membutuhkan rutinitas yang disesuaikan untuk manajemen transaksi (misalnya, cukup kecil)
- Dampak programatik kecil, meskipun dapat mengakibatkan transaksi besar
- Berikan DAO dengan profil pengambilan dinamis , misalnya,
loadData(id, fetchProfile);
- Aplikasi harus mengetahui profil mana yang akan digunakan kapan
- Jenis transaksi AoP, misalnya, operasi intersepsi dan melakukan transaksi bila diperlukan
- Memerlukan manipulasi kode byte atau penggunaan proxy
- Kehilangan kendali saat transaksi dilakukan
- Ilmu hitam, seperti biasa :)
Apakah saya melewatkan opsi apa pun?
Manakah pendekatan pilihan Anda saat mencoba meminimalkan dampak lazy-loaded
hubungan dalam desain aplikasi Anda?
(Oh, dan maaf untuk WoT )