Perbedaan Antara JPA, Hibernate dan EclipseLink

1. Perkenalan

Dalam tutorial ini, kita akan membahas Hibernate dan Java Persistence API (JPA) - dengan fokus pada perbedaan di antara keduanya.

Kami akan mulai dengan mengeksplorasi apa itu JPA, bagaimana penggunaannya, dan konsep inti di baliknya.

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

2. Pemetaan Relasional Objek

Sebelum kita menyelami JPA, penting untuk memahami konsep Pemetaan Relasional Objek - juga dikenal sebagai ORM.

Pemetaan objek-relasional hanyalah proses mempertahankan objek Java apa pun secara langsung ke tabel database . Biasanya, nama objek yang dipertahankan menjadi nama tabel, dan setiap bidang di dalam objek itu menjadi kolom. Dengan tabel disiapkan, setiap baris sesuai dengan catatan dalam aplikasi.

3. Pengantar JPA

Java Persistence API, atau JPA, adalah spesifikasi yang mendefinisikan pengelolaan data relasional dalam aplikasi Java. API memetakan sekumpulan konsep yang menentukan objek mana dalam aplikasi yang harus dipertahankan, dan bagaimana harus mempertahankannya.

Penting untuk dicatat di sini bahwa JPA hanyalah spesifikasi dan perlu implementasi agar berfungsi - tetapi lebih dari itu nanti.

Sekarang, mari kita bahas beberapa konsep inti JPA yang harus dicakup oleh implementasi.

3.1. Kesatuan

Kelas javax.persistence.Entity menentukan objek mana yang harus disimpan ke database . Untuk setiap entitas yang bertahan, JPA membuat tabel baru dalam database yang dipilih.

Selain itu, semua entitas yang dipilih harus menentukan kunci utama yang dilambangkan dengan anotasi @Id . Bersama dengan anotasi @GeneratedValue , kami mendefinisikan bahwa kunci utama harus dibuat secara otomatis saat rekaman disimpan ke database.

Mari kita lihat contoh singkat dari entitas yang dijelaskan oleh JPA.

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

Ingat, ini saat ini tidak akan berpengaruh pada aplikasi - JPA tidak menyediakan kode implementasi apa pun.

3.2. Persistensi Lapangan

Konsep inti lain dari JPA adalah ketekunan lapangan . Saat objek di Java didefinisikan sebagai entitas, semua bidang di dalamnya secara otomatis disimpan sebagai kolom yang berbeda dalam tabel entitas.

Jika ada bidang di dalam objek tetap yang tidak ingin kita pertahankan ke database, kita bisa mendeklarasikan bidang sementara dengan anotasi @Transient .

3.3. Hubungan

Selanjutnya, JPA menentukan bagaimana kita harus mengelola hubungan antara tabel database yang berbeda dalam aplikasi kita. Seperti yang telah kita lihat, JPA menangani ini dengan anotasi. Ada empat anotasi hubungan yang perlu kita ingat:

  1. @OneTone
  2. @OneTany
  3. @Bayu_joo
  4. @Banyak ke banyak

Mari kita lihat cara kerjanya:

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

Dalam contoh kami di atas, kelas SteeringWheel menjelaskan hubungan satu ke satu dengan kelas Mobil kami dari sebelumnya.

3.4. Manajer Entitas

Terakhir, kelas javax.persistence.EntityManager menentukan operasi ke dan dari database. The EntityManager mengandung umum Buat, Baca, Update dan Delete (CRUD) operasi yang bertahan ke database.

4. Implementasi JPA

Dengan spesifikasi JPA yang menentukan bagaimana dan apa yang harus kita pertahankan, sekarang kita perlu memilih penyedia implementasi untuk menyediakan kode yang diperlukan . Tanpa penyedia seperti itu, kita perlu menerapkan semua kelas yang relevan agar sesuai dengan JPA, dan itu banyak pekerjaan!

Ada banyak penyedia untuk dipilih, dengan masing-masing menampilkan pro dan kontra sendiri. Saat membuat keputusan yang akan digunakan, kita harus mempertimbangkan beberapa poin berikut :

  1. Kematangan proyek - sudah berapa lama penyedia tersebut ada , dan seberapa baik didokumentasikan?
  2. Subproyek - apakah penyedia memiliki subproyek yang berguna untuk aplikasi baru kita?
  3. Dukungan komunitas - adakah yang bisa membantu kami saat kami mengalami bug kritis ?
  4. Benchmarking - bagaimana performansi implementasinya?

Meskipun kami tidak akan membahas secara mendalam tentang tolok ukur penyedia JPA yang berbeda, JPA Performance Benchmark (JPAB) berisi wawasan yang berharga tentang hal ini.

Mari kita lihat sekilas beberapa penyedia JPA teratas.

5. Hibernasi

Pada intinya, Hibernate adalah alat pemetaan relasional objek yang menyediakan implementasi JPA . Hibernate adalah salah satu implementasi JPA yang paling matang , dengan komunitas besar yang mendukung proyek tersebut.

Ini mengimplementasikan semua javax.persistencekelas yang kita lihat sebelumnya di artikel serta menyediakan fungsionalitas di luar JPA - alat Hibernasi, validasi, dan pencarian. Meskipun API khusus Hibernasi ini mungkin berguna, mereka tidak diperlukan dalam aplikasi yang hanya memerlukan fungsionalitas JPA dasar.

Mari kita cepat melihat apa yang menawarkan Hibernate dengan @ Entity penjelasan.

Saat memenuhi kontrak JPA, @ org.hibernate.annotations.Entity menambahkan metadata tambahan yang melampaui spesifikasi JPA. Tindakan tersebut memungkinkan penyesuaian ketekunan entitas. Misalnya, mari kita lihat beberapa anotasi yang ditawarkan oleh Hibernate yang memperluas fungsionalitas @Entity :

  1. @Table - memungkinkan kita menentukan nama tabel yang dibuat untuk entitas tersebut
  2. @BatchSize - menetapkan ukuran batch saat mengambil hak dari tabel

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

  1. Disesuaikan CRUD pernyataan dengan @SQLInsert, @SQLUpate dan @SQLDelete penjelasan
  2. Dukungan untuk penghapusan lunak
  3. Entitas tidak berubah dengan anotasi @Immutable

Untuk mengetahui lebih dalam tentang persistensi Hibernate dan Java - buka seri tutorial Ketekunan Musim Semi kami.

6. EclipseLink

EclipseLink, dibangun oleh Eclipse Foundation, menyediakan implementasi JPA bersumber terbuka . Selain itu, EclipseLink mendukung sejumlah standar ketekunan lainnya seperti Java Architecture for XML Binding (JAXB) .

Sederhananya, daripada menahan objek ke baris database, JAXB memetakannya ke representasi XML.

Berikutnya, dengan membandingkan sama @ Entity pelaksanaan penjelasan, kita melihat bahwa EclipseLink penawaran ekstensi lagi yang berbeda. Meskipun tidak ada anotasi untuk @ BatchSize seperti yang kita lihat sebelumnya, EclipseLink menawarkan opsi lain yang tidak dimiliki Hibernate.

Sebagai contoh:

  1. @ReadOnly - menentukan entitas yang akan dipertahankan adalah hanya-baca
  2. @ Struct - mendefinisikan kelas yang akan dipetakan ke tipe 'struct' database

Untuk membaca lebih lanjut tentang apa yang ditawarkan EclipseLink, buka panduan kami di EclipseLink dengan Spring.

7. Kesimpulan

Di artikel ini, kita telah melihat Java Persistence API, atau JPA.

Terakhir, kami menjelajahi perbedaannya dengan Hibernate dan EclipseLink.