Perbezaan Antara JPA, Hibernate dan EclipseLink

1. Pengenalan

Dalam tutorial ini, kita akan membincangkan Hibernate dan Java Persistence API (JPA) - dengan fokus pada perbezaan di antara mereka.

Kita akan mulakan dengan meneroka apa itu JPA, bagaimana ia digunakan, dan konsep teras di belakangnya.

Kemudian, kita akan melihat bagaimana Hibernate dan EclipseLink sesuai dengan gambar.

2. Pemetaan Objektif-Hubungan

Sebelum kita menyelami JPA, penting untuk memahami konsep Object-Relational Mapping - juga dikenali sebagai ORM.

Pemetaan objek-relasional hanyalah proses mempertahankan objek Java langsung ke tabel pangkalan data . Biasanya, nama objek yang dikekalkan menjadi nama jadual, dan setiap bidang dalam objek itu menjadi lajur. Dengan pengaturan meja, setiap baris sesuai dengan catatan dalam aplikasi.

3. Pengenalan JPA

Java Persistence API, atau JPA, adalah spesifikasi yang menentukan pengelolaan data hubungan dalam aplikasi Java. API memetakan sekumpulan konsep yang menentukan objek mana dalam aplikasi harus bertahan, dan bagaimana ia harus bertahan.

Penting untuk diperhatikan di sini bahawa JPA hanyalah spesifikasi dan memerlukan pelaksanaan untuk berfungsi - tetapi lebih lanjut mengenai itu kemudian.

Sekarang, mari kita bincangkan beberapa konsep JPA teras yang mesti diliputi oleh pelaksanaan.

3.1. Entiti

The javax.persistence.Entity mentakrifkan kelas yang objek perlu berterusan kepada pangkalan data . Untuk setiap entiti yang berterusan, JPA membuat jadual baru dalam pangkalan data yang dipilih.

Di samping itu, semua entiti yang dipilih harus menentukan kunci utama yang dilambangkan oleh anotasi @Id . Bersama dengan anotasi @GeneratedValue , kami menentukan bahawa kunci utama harus dijana secara automatik apabila rekod disimpan ke pangkalan data.

Mari kita lihat contoh ringkas entiti yang dijelaskan oleh JPA.

@Entity public class Car { @GeneratedValue @Id public long id; // getters and setters } 

Ingat, ini tidak akan mempengaruhi aplikasi - JPA tidak memberikan kod pelaksanaan apa pun.

3.2. Ketekunan Padang

Konsep teras JPA yang lain adalah kegigihan lapangan . Apabila objek di Java didefinisikan sebagai entitas, semua bidang di dalamnya secara automatik akan bertahan sebagai lajur yang berbeza dalam tabel entitas.

Sekiranya terdapat medan dalam objek yang masih ada yang tidak ingin kami teruskan ke pangkalan data, kami dapat menyatakan medan sementara dengan anotasi @Transient .

3.3. Perhubungan

Seterusnya, JPA menentukan bagaimana kita harus menguruskan hubungan antara jadual pangkalan data yang berbeza dalam aplikasi kita. Seperti yang telah kita lihat, JPA menangani perkara ini dengan penjelasan. Terdapat empat anotasi hubungan yang perlu kita ingat:

  1. @OneToOne
  2. @OneToMany
  3. @ManyToOne
  4. @ManyToMany

Mari lihat bagaimana ini berfungsi:

@Entity public class SteeringWheel { @OneToOne private Car car // getters and setters }

Dalam contoh kami di atas, kelas SteeringWheel menerangkan hubungan satu lawan satu dengan kelas Kereta kami dari sebelumnya.

3.4. Pengurus Entiti

Akhirnya, kelas javax.persistence.EntityManager menentukan operasi ke dan dari pangkalan data. The EntityManager mengandungi biasa Buat, Read, mengemaskini dan memadam operasi (CRUD) yang berterusan kepada pangkalan data.

4. Pelaksanaan JPA

Dengan spesifikasi JPA menentukan bagaimana dan apa yang harus kita bertahan, kita sekarang perlu memilih penyedia pelaksanaan untuk menyediakan kod yang diperlukan . Tanpa penyedia tersebut, kita perlu melaksanakan semua kelas yang relevan untuk mematuhi JPA, dan itu banyak kerja!

Terdapat banyak penyedia untuk dipilih, dengan masing-masing memaparkan kelebihan dan kekurangannya sendiri. Semasa membuat keputusan mengenai mana yang harus digunakan, kita harus mempertimbangkan beberapa perkara berikut :

  1. Kematangan projek - berapa lama penyedia berada , dan seberapa baik didokumentasinya?
  2. Subproyek - adakah penyedia mempunyai subproyek yang berguna untuk aplikasi baru kami?
  3. Sokongan komuniti - adakah orang yang dapat menolong kita ketika menghadapi bug kritikal ?
  4. Penanda aras - bagaimana prestasi pelaksanaannya?

Walaupun kita tidak akan membahas penanda aras penyedia JPA yang berbeza, Tanda Aras Prestasi JPA (JPAB) mengandungi pandangan berharga mengenai hal ini.

Dengan begitu, mari kita lihat sebentar beberapa penyedia utama JPA.

5. Hibernate

Pada intinya, Hibernate adalah alat pemetaan objek-relasional yang menyediakan pelaksanaan JPA . Hibernate adalah salah satu pelaksanaan JPA yang paling matang di sekitar, dengan komuniti besar yang menyokong projek tersebut.

Ia menerapkan semua javax.persistencekelas yang kita lihat pada awal artikel serta menyediakan fungsi di luar JPA - Hibernate alat, pengesahan, dan carian. Walaupun API khusus Hibernate ini mungkin berguna, API tersebut tidak diperlukan dalam aplikasi yang hanya memerlukan fungsi JPA asas.

Mari kita lihat dengan cepat apa yang Hibernate tawarkan dengan anotasi @Entity .

Semasa memenuhi kontrak JPA, @ org.hibernate.annotations.Entity menambah metadata tambahan yang melampaui spesifikasi JPA. Melakukannya membolehkan ketekunan penyempurnaan entiti. Sebagai contoh, mari kita lihat beberapa anotasi yang ditawarkan oleh Hibernate yang memperluas fungsi @Entity :

  1. @ Jadual - membolehkan kami menentukan nama jadual yang dibuat untuk entiti
  2. @BatchSize - menentukan ukuran kumpulan ketika mengambil hak dari jadual

Perlu juga diperhatikan beberapa ciri tambahan yang tidak ditentukan oleh JPA, yang mungkin berguna dalam aplikasi yang lebih besar:

  1. Disesuaikan CRUD pernyataan dengan @SQLInsert, @SQLUpate dan @SQLDelete anotasi
  2. Sokongan untuk pemadaman lembut
  3. Entiti tidak berubah dengan anotasi @Imutut

Untuk mengetahui lebih mendalam mengenai kegigihan Hibernate dan Java - teruskan ke siri tutorial kegigihan Spring kami.

6. EclipseLink

EclipseLink, yang dibina oleh Eclipse Foundation, menyediakan pelaksanaan JPA sumber terbuka . Selain itu, EclipseLink menyokong sebilangan standard ketekunan lain seperti Java Architecture for XML Binding (JAXB) .

Ringkasnya, daripada meneruskan objek ke baris pangkalan data, JAXB memetakannya ke representasi XML.

Seterusnya, dengan membandingkan pelaksanaan anotasi @Entity yang sama , kita melihat bahawa EclipseLink menawarkan lagi peluasan yang berbeza. Walaupun tidak ada anotasi untuk @ BatchSize seperti yang kita lihat sebelumnya, EclipseLink menawarkan pilihan lain yang tidak dilakukan oleh Hibernate.

Sebagai contoh:

  1. @ReadOnly - menentukan entiti yang akan bertahan hanya baca
  2. @ Struct - mentakrifkan kelas untuk memetakan ke jenis 'struktur' pangkalan data

Untuk membaca lebih lanjut mengenai apa yang ditawarkan EclipseLink, kunjungi panduan kami mengenai EclipseLink with Spring.

7. Kesimpulannya

Dalam artikel ini, kami telah melihat Java Persistence API, atau JPA.

Akhirnya, kami meneroka bagaimana ia berbeza dengan Hibernate dan EclipseLink.