Selamat malam, Habr.
Artikel ini adalah upaya untuk memudahkan pencarian orang-orang yang mulai hibernate dan dihadapkan dengan pertanyaan yang sama dengan saya - yaitu,
bagaimana menulis dengan benar pada alat ini . (Ini akan sangat berguna bagi programmer yang datang ke java dari bahasa yang diketik dengan lemah). Tidak akan ada kode, akan ada prinsip dasar tentang cara menggunakan teknologi ini secara produktif. Semua yang ditulis di bawah cut adalah IMHO saya, tidak mengklaim satu-satunya solusi yang mungkin untuk masalah ini.
Jadi
Segera buat reservasi bahwa pengalaman saya dengan
Spring Data JPA .
Karena Hibernate adalah kerangka kerja perusahaan, sulit untuk menemukan contoh kode di dalamnya yang lebih dalam dari CRUD biasa. Fakta ini benar-benar menyulitkan pemahaman tentang bagaimana menulis di Hiber, bagaimana para pengembang kerangka kerja itu sendiri membayangkan kode yang baik - sebagai hasilnya, saya harus memikirkan masalah ini sendiri. Saya yakin saya tidak sendirian.
@
Hal pertama yang dapat Anda perhatikan adalah bahwa tidak ada database sebagai abstraksi. Dalam hibernasi, semuanya telah dilakukan untuk mendapatkan kontrol penuh atas database dalam kode (Anda dapat google Manajemen Entitas). Basis data Anda adalah objek domain yang melakukan fungsi penyimpanan yang hampir bodoh. Karenanya aturan penting: jangan menggunakannya untuk apa pun selain penyimpanan. Mereka seharusnya tidak menjalankan fungsi DTO yang menerima input pengguna, dan tidak boleh berfungsi sebagai tampilan selama serialisasi. Mereka memiliki kaki.
Luar biasa tapi benarSecara umum, mengejutkan bahwa saya tidak melihat di segmen pendidikan Internet (termasuk bahasa Inggris) contoh menggunakan kelas tambahan untuk serialisasi, misalnya, di json. Siapa yang pernah mengatakan bahwa jika Anda memiliki layanan REST, maka Anda tidak perlu khawatir tentang kelas tampilan?)
Ya, dan bukan untuk REST, intuisi menunjukkan bahwa dengan nada yang baik, intuisi akan memberikan kepada klien hanya set data yang dibutuhkan, sementara semua data siap (dan tidak harus memanggil getter pada klien untuk inisialisasi malas).
@
Ini menyiratkan aturan berikut - mereka tidak boleh peduli tentang format penggunaan. Apakah kita memerlukan daftar produk (di mana hanya nama dan deskripsi akan) atau halaman produk (dengan foto dan ulasan) - klien akan menerima dalam satu kasus
List
dari
SimpleProductViewer (id, name, description)
, dan di
ExtendedProductViewer (id, name, description, List(photos), List(reviews), rating)
lainnya
ExtendedProductViewer (id, name, description, List(photos), List(reviews), rating)
, yang akan dihasilkan dalam metode kelas
ProductService
dan menggunakan kelas domain
hanya sebagai sumber data.
Hal yang sama dengan input. Ini Java, ini dia boleh melakukan DTO dengan bidang yang berbeda untuk setiap kasus :)
Sebagai contoh, saya akan meningkatkan basis kelas untuk domain Produk yang diretas. Apa yang sudah kita miliki:
- Produk (domain)
- Penampil (kelas untuk tampilan informasi klien, bisa berapa saja)
- Dto (kelas untuk mendapatkan informasi juga bisa nomor apa saja)
- Repositori (untuk menerima data)
- Layanan (atau Manajer) - kotak hitam untuk logika bisnis yang tidak terkendali, yang menggabungkan semua poin sebelumnya.
@
Sepertinya saya (tampaknya) bahwa Java Enterprise tidak sangat dioptimalkan (ini dapat dilihat sudah atas permintaan hibernate dan fakta bahwa OOP (hibernate) telah mengambil alih selimut untuk mengelola entitas database). Oleh karena itu, saya percaya bahwa hal utama dalam konteks ini adalah korespondensi kode dengan ide-ide pengembang kerangka kerja, dan bukan strategi optimal.
@
Jika Anda melihat domain hibernasi dengan cara ini (hanya penyimpanan data),
@ManyToOne
tampaknya merupakan mekanisme yang tidak begitu sering digunakan dan hanya berlaku untuk tabel yang sepenuhnya bergantung - gambar, ulasan, komentar. Pada prinsipnya, ini normal - menurut saya, tidak perlu memperluas efeknya ke tabel inti dari database Anda.
Meringkas
- Gunakan domain hanya untuk penyimpanan data, diharapkan bahwa properti kelas terkandung dalam tabel basis data target, yaitu, tidak ada yang berlebihan (ditentukan oleh logika bisnis).
- Tidak perlu mencoba memperluas domain - perluas kelas tampilan, dan gunakan kelas domain hanya sebagai penyedia data.
- Jangan takut untuk menghasilkan jenis kelas yang sama - pemahaman dan fleksibilitas penggunaan lebih penting. Maksimum yang dapat dilakukan untuk mengurangi jumlah kode adalah dengan mewarisinya dari domain.
- Jangan mengejar optimasi. Untuk anak laki-laki java ini tidak penting, meskipun, tentu saja, semuanya tergantung pada konteksnya.
Sesuatu seperti itu.