1.1 Memetakan kelas kepada jadual

Selepas mempelajari JDBC, anda berkemungkinan besar mempunyai tanggapan bahawa bekerja dengan pangkalan data daripada aplikasi Java masih menyeronokkan. Bagaimana jika saya memberitahu anda bahawa semua kerja ini boleh dilakukan 10 kali lebih mudah?

Apakah kelebihan utama bahasa SQL? Ini ialah bahasa deklaratif - ia menerangkan perkara yang kita mahu dapatkan, dan tidak mengatakan apa-apa tentang cara melakukannya. Bagaimana - ini adalah kebimbangan pelayan SQL.

Pendekatan yang sama boleh digunakan apabila bekerja dengan pangkalan data.

Dalam dunia yang ideal, kami hanya boleh menulis pertanyaan SQL ke pangkalan data, dan sebagai tindak balas kami akan menerima objek Java siap pakai, atau koleksi objek Java, jika kami meminta beberapa keping.

Apa yang boleh saya katakan, inilah yang difikirkan oleh beberapa lelaki pada tahun 2000 dan memutuskan untuk menulis rangka kerja ORM mereka sendiri.

ORM bermaksud Pemetaan Perhubungan Objek dan pada asasnya ialah pemetaan objek Java kepada pertanyaan SQL.

Mereka datang dengan perkara yang sangat mudah - setiap jadual dalam pangkalan data mesti sepadan dengan beberapa kelas dalam aplikasi Java . Dalam aplikasi Java, kami beroperasi dengan objek, dan objek ini sudah tahu cara menyimpan diri mereka ke pangkalan data.

Terdapat tiga pendekatan untuk menyelesaikan masalah ini, dan ia kelihatan seperti ini:

  1. Objek menyimpan dirinya ke pangkalan data dan mengemas kini medannya berdasarkan maklumat daripada pangkalan data.
  2. Objek dapat menyimpan dirinya ke pangkalan data, tetapi tidak pernah memulakan kes ini.
  3. Objek hanya mengandungi data, dan seseorang menyimpannya ke pangkalan data dan memuatkannya dari pangkalan data.

Pada mulanya, pendekatan pertama mendominasi, kemudian pelayan Aplikasi dan Enterprise Java Beans adalah popular. Malah terdapat seluruh kelas kacang yang dipanggil Persistence EJBs yang boleh menyelamatkan diri mereka sendiri ke dalam pangkalan data.

Tapi satu hari semuanya berubah...

1.2 Kemunculan Hibernate

Pada tahun 2001, versi pertama rangka kerja Hibernate telah dikeluarkan. Ia adalah rangka kerja yang sangat mudah, tetapi ia membenarkan penggunaan "objek bodoh" biasa yang tidak tahu apa-apa tentang cara ia harus disimpan dalam pangkalan data atau dimuatkan dari sana.

Pemetaan medan kelas Java dan lajur dalam jadual dalam pangkalan data telah ditetapkan menggunakan fail XML. Dan kadang-kadang mereka agak besar. Okay, siapa yang saya bergurau. Mereka adalah kanvas besar kod XML. Dan keadaan itu dapat diselamatkan hanya dengan fakta bahawa 20 tahun yang lalu tidak ada pangkalan data yang begitu besar seperti sekarang.

Tetapi sebenarnya, keputusan yang paling berkuasa ialah akhirnya memisahkan objek yang perlu disimpan ke pangkalan data daripada kod yang menyimpannya di sana . Penyelesaian ini tidak begitu jelas. Kerana prinsip enkapsulasi menyatakan bahawa objek paling mengetahui bagaimana ia perlu disimpan dan dimuatkan.

Dan pendekatan ORM benar-benar memecahkan konsep itu. Kelas data mendedahkan struktur dalamannya, tetapi ia telah menjadi lebih mudah untuk dikendalikan dengan kumpulan objek daripada jenis yang berbeza.

Satu kejayaan besar datang selepas keluaran Java 5 , apabila dua perkara muncul dalam JDK:

  • Anotasi
  • proksi

AnotasiXML telah digantikan dengan cepat, dan kini mudah untuk menentukan semua tetapan yang diperlukan untuk memetakan kelas Java ke jadual dalam pangkalan data betul-betul dalam kelas Java.

proksitidak begitu ketara kepada pengguna Hibernate, tetapi sumbangan mereka adalah lebih serius. Apabila anda meminta objek atau objek tertentu daripada Hibernate, ia hanya mengembalikan tunas (proksi) kepada anda dan memintas semua panggilan ke kaedahnya.

Ini memungkinkan untuk melaksanakan pelbagai mekanisme Lazy Loading dan meningkatkan kelajuan dan kecekapan Hibernate ke tahap setinggi langit sepenuhnya untuk masa itu. Hibernate telah menjadi bukan sahaja standard industri de facto - ia telah mula diterjemahkan ke dalam bahasa lain. Jadi, sebagai contoh, Framework NHibernate muncul untuk C#.

1.3 Kemunculan JPA

De facto diikuti dengan pengiktirafan de jure. Pembangun JDK memutuskan untuk mencipta spesifikasi tentang cara memetakan objek dengan betul ke jadual dalam pangkalan data. Spesifikasi ini dipanggilJPA- API Kegigihan Java.

Ini betul-betul spesifikasinya. Ia menerangkan cara segala-galanya harus berfungsi dan anotasi apa yang kita perlukan untuk menandakan bahagian kelas yang berlainan jika kita mahu objeknya disimpan ke pangkalan data.

Nampaknya lelaki itu hanya mengambil Hibernate sebagai asas dan menukar nama pakej daripadanya. Kerana semua anotasi yang ada dalam Hibernate berpindah ke JPA hampir satu persatu.

Hari ini, Hibernate melaksanakan sepenuhnya keseluruhan spesifikasi JPA, serta beberapa ciri tambahan yang menjadikan bekerja dengannya lebih selesa. Oleh itu, dari segi penyeragaman, kita boleh mengatakan bahawa Hibernate mempunyai dua set ciri:

  • piawaian JPA
  • API Asli Hibernate (fungsi tambahan)

Dokumentasi Hibernate rasmi menerangkannya seperti ini:

Tetapi kedua-duanya berdasarkan pengalaman saya dan selepas membaca semula dokumentasi Hibernate, saya boleh mengatakan bahawa JPA dan API Hibernate adalah 95% sama. Mereka hanya konsep yang sama.

1.4 Maven untuk Hibernate

Memandangkan saya sangat memuji Hibernate, saya rasa sudah tiba masanya untuk meneruskan usaha dengan lebih keras.

Pertama, terdapat tapak rasmi, di mana terdapat hanya sekumpulan dokumentasi berbahasa Inggeris. Dia, sudah tentu, mempunyai berat sebelah dalam maklumat rujukan, dan bukan dalam latihan. Tetapi ia masih lebih baik daripada menyahpepijat sumber, bukan? :)

Arahan:

  1. Anda buka pautan .
  2. Awak tengok dia lama-lama.
  3. Kembali ke CodeGym.
  4. Anda baca kuliah saya selanjutnya.

Tugas saya adalah untuk memudahkan perkara yang rumit dan menerangkannya dengan istilah yang mudah. Dan jika anda telah mencapai tahap ini, maka saya boleh melakukannya.

Nah, untuk bermula dengan Hibernate, anda perlu menambahkannya pada pom.xml anda. Sehingga kini, versi ke-6 Hibernate sudah tersedia, atau lebih tepatnya 6.1.1, jadi kami akan belajar cara bekerja dengan versi terkini.

Cuma tambahkan baris ini pada pom.xml anda:

<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

Jika anda membaca kuliah ini di luar tetingkap 2023+, maka versi baharu boleh dimuat turun di sini .

Penting! Beberapa pustaka yang digunakan Hibernate telah ditamatkan dalam JDK 11 dan JDK 17, jadi jika anda menghadapi masalah untuk menyiapkan dan menjalankan projek anda, tambahkan kebergantungan ini padanya:

<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
</dependency>

<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
</dependency>