Apa perbedaan antara JPA dan Hibernate? [Tutup]

680

Saya mengerti bahwa JPA 2 adalah spesifikasi dan Hibernate adalah alat untuk ORM. Juga, saya mengerti bahwa Hibernate memiliki lebih banyak fitur daripada JPA 2. Tetapi dari sudut pandang praktis, apa bedanya?

Saya memiliki pengalaman menggunakan iBatis dan sekarang saya mencoba mempelajari Hibernate atau JPA2. Saya mengambil buku Pro JPA2 dan terus mengacu pada "penyedia JPA". Sebagai contoh:

Jika Anda berpikir fitur harus distandarisasi, Anda harus angkat bicara dan memintanya dari penyedia JPA Anda

Ini membingungkan saya, jadi saya punya beberapa pertanyaan:

  • Dengan menggunakan JPA2 saja saya dapat mengambil data dari DB hanya dengan memberi anotasi pada POJO saya
  • Apakah JPA2 seharusnya digunakan dengan "Penyedia JPA" misalnya TopLink atau Hibernate? Jika demikian, lalu apa manfaat menggunakan JPA2 + Hibernate dibandingkan dengan JPA2 saja, atau dibandingkan dengan Hibernate saja?
  • Tolong rekomendasikan buku JPA2 praktis yang bagus. "Pro JPA2" sepertinya lebih seperti sebuah Alkitab dan referensi tentang JPA2 (Tidak masuk ke dalam Query sampai paruh buku selanjutnya). Apakah ada buku yang mengambil pendekatan masalah / solusi untuk JPA2?
Anthony
sumber
2
Pertanyaan tentang "perbedaan antara JPA dan Hibernate" salah. Battle Hibernate vs JPA tidak ada gunanya. Dianjurkan untuk menggunakan implementasi JPA dengan JPA API untuk menghindari penerapan ORM yang berbeda.
BERGUIGA Mohamed Amine
18
@ Berguiga.M.Amine, Jika kita sudah tahu bahwa pertanyaan di atas salah. Kami tidak perlu bertanya lagi. Saya juga tertarik dengan topik ini.
Do Nhu Vy
Saya memiliki kebingungan dengan JpaTemplate yang digunakan pada musim semi "org.springframework.orm.jpa.JpaTemplate" ia memiliki fungsi sendiri seperti bertahan (), menemukan (), menggabungkan () dll. Lalu bagaimana hal-hal bekerja tanpa hibernasi?
nitin verma
@nitinverma: Itu benar-benar pertanyaan terpisah. Jika Anda masih membutuhkan jawaban, saya sarankan Anda mengajukan pertanyaan Anda sendiri secara terpisah untuk menarik lebih banyak umpan balik.
Wouter

Jawaban:

776

Seperti yang Anda sebutkan, JPA hanyalah sebuah spesifikasi, artinya tidak ada implementasi. Anda dapat membuat anotasi kelas Anda sebanyak yang Anda inginkan dengan anotasi JPA, namun tanpa implementasi tidak akan terjadi apa-apa. Pikirkan JPA sebagai pedoman yang harus diikuti atau antarmuka, sedangkan implementasi JPA Hibernate adalah kode yang memenuhi API sebagaimana ditentukan oleh spesifikasi JPA dan menyediakan fungsionalitas di bawah kap.

Ketika Anda menggunakan Hibernate dengan JPA Anda sebenarnya menggunakan implementasi Hibernate JPA. Manfaatnya adalah Anda dapat menukar implementasi HiPAate dari JPA untuk implementasi spesifikasi JPA lainnya. Ketika Anda menggunakan Hibernate langsung, Anda mengunci implementasi karena ORM lain mungkin menggunakan metode / konfigurasi dan anotasi yang berbeda, oleh karena itu Anda tidak bisa begitu saja beralih ke ORM lain.

Untuk keterangan lebih rinci baca entri blog saya .

Kevin Bowersox
sumber
5
Jadi, saat Anda menggunakan Hibernate dengan JPA, anotasi {java.persistence} akan berfungsi atau Anda harus menggunakan anotasi {org.hibernate}?
Amruta
62
Saya hanya ingin menambahkan bahwa mengganti satu ORM dengan yang berbeda adalah kesempatan yang sangat langka, jadi Anda mungkin tidak akan pernah mendapatkan manfaat ini dari menggunakan JPA. Apa yang Anda peroleh dengan JPA adalah protokol, standar, penamaan, dan konvensi lain yang dapat Anda gunakan untuk berkomunikasi dengan orang lain.
pubsy
3
@pubsy Saya setuju, tetapi pada prinsipnya itu adalah salah satu nilai jual suatu spesifikasi.
Kevin Bowersox
6
@Aruta untuk menjawab pertanyaan Anda, ketika seseorang menggunakan Hibernate dengan JPA, anotasi {java.persistence} akan berfungsi dan tidak perlu menggunakan anotasi {org.hibernate}.
Learner
3
@JavaGeek itu benar selama kode seseorang menggunakan hanya antarmuka yang disebutkan dalam JPA. Jika seseorang menggunakan fitur khusus untuk hibernasi maka mereka harus menggunakan org.hibernateanotasi. lebih lanjut tentang ini
Suryavanshi
632

JPA adalah tariannya, Hibernate adalah penari.

johnm
sumber
189
JPA adalah Seni, Hibernate adalah artis.
Lucky
10
Saya suka rasa humor ini: JPA adalah sutradara, Hibernate adalah seorang aktor.
user3278897
7
tapi, Dancer (Hibernate) dapat tampil tanpa menari (JPA) bukan: /
RevanthKrishnaKumar V.
3
Jawaban ini tidak menjelaskan apa pun, hanya perkataan yang tidak jelas.
Amir Kost
11
Metafora ini tidak menambah pengertian. Jika Anda sudah tahu bedanya, Anda akan mendapati hal itu mengecewakan. Jika Anda tidak tahu bedanya, Anda tetap tidak akan mengetahuinya.
Nick Volynkin
158

Beberapa hal terlalu sulit untuk dipahami tanpa perspektif historis bahasa dan pemahaman tentang JCP.

Seringkali ada pihak ketiga yang mengembangkan paket yang menjalankan fungsi atau mengisi celah yang bukan bagian dari JDK resmi. Karena berbagai alasan fungsi itu dapat menjadi bagian dari Java JDK melalui JCP (Java Community Process)

Hibernate (tahun 2003) menyediakan cara untuk abstrak SQL dan memungkinkan pengembang untuk berpikir lebih banyak dalam hal objek yang bertahan lama (ORM). Anda memberi tahu hibernasi tentang objek Entitas Anda dan secara otomatis menghasilkan strategi untuk bertahan mereka. Hibernate menyediakan implementasi untuk melakukan ini dan API untuk mendorong implementasi baik melalui konfigurasi XML atau anotasi.

Masalah mendasar sekarang adalah bahwa kode Anda menjadi sangat erat dengan vendor tertentu (Hibernate) untuk apa yang banyak orang pikir harus lebih umum. Oleh karena itu kebutuhan untuk API ketekunan generik.

Sementara itu, JCP dengan banyak masukan dari Hibernate dan vendor alat ORM lainnya sedang mengembangkan JSR 220 (Java Spesifikasi Permintaan) yang menghasilkan JPA 1.0 (2006) dan akhirnya JSR 317 yaitu JPA 2.0 (2009). Ini adalah spesifikasi dari Java Persistence API generik. API disediakan di JDK sebagai satu set antarmuka sehingga kelas Anda dapat bergantung pada javax.persistence dan tidak khawatir tentang vendor tertentu yang melakukan pekerjaan mempertahankan objek Anda. Ini hanya API dan bukan implementasinya. Hibernate sekarang menjadi salah satu dari banyak vendor yang mengimplementasikan spesifikasi JPA 2.0. Anda dapat membuat kode menuju JPA dan memilih vendor ORM yang sesuai dengan kebutuhan Anda.

Ada kasus di mana Hibernate dapat memberi Anda fitur yang tidak dikodifikasikan dalam JPA. Dalam hal ini, Anda dapat memilih untuk memasukkan anotasi spesifik Hibernate langsung di kelas Anda karena JPA tidak menyediakan antarmuka untuk melakukan hal itu.

Sumber: http://www.reddit.com/r/java/comments/16ovek/understanding_when_to_use_jpa_vs_hibernate/

Ken Block
sumber
2
Bagian sejarah yang bagus. sementara jawaban lain hanya mengulangi apa yang ada dalam pertanyaan.
Robert
1
Terima kasih atas perhatiannya yang mencerahkan. Anda mengatakan JPA dilakukan karena aplikasi di mana sangat digabungkan dengan Hibernate, itu adalah kebutuhan untuk abstraksi, ok. Tapi bukankah itu masalah tak terbatas? Bukankah aplikasi sekarang sangat digabungkan ke JPA? Apa manfaat nyata di sini? Saya sudah melihat Hibernate sebagai Layer abstraksi ...
Aphax
4
@Aphax Tentu, dan saat Anda memberi kode pada file .java, Anda juga terhubung dengan Java, jadi bagaimana jika saya ingin beralih ke Python besok?
Smutje
100

JPA adalah antarmuka sementara Hibernate adalah implementasinya.

Secara tradisional ada beberapa solusi Java ORM:

setiap implementasi mendefinisikan definisi pemetaannya sendiri atau API klien. Kelompok ahli JPA mengumpulkan yang terbaik dari semua alat ini sehingga mereka menciptakan standar Java Persistence API.

API persistensi standar sangat nyaman dari sudut pandang klien, membuatnya relatif mudah untuk beralih satu implementasi dengan yang lain (walaupun dalam praktiknya tidak sesederhana itu karena pada proyek besar Anda tetap harus menggunakan fitur non-standar spesifik) .

JPA standar telah mendorong kompetisi Java ORM ke tingkat yang baru dan ini hanya dapat mengarah pada implementasi yang lebih baik.

Seperti yang dijelaskan dalam buku saya, Java Persistence Berkinerja Tinggi , Hibernate menawarkan fitur yang belum didukung oleh JPA :

Fitur-fitur tambahan ini memungkinkan Hibernate untuk mengatasi banyak persyaratan persistensi yang diminta oleh aplikasi perusahaan besar.

Vlad Mihalcea
sumber
Ini bagus, saya tidak tahu tentang alat ORM lain sebelumnya
Avdhut
Jawaban yang bagus dan saya sangat menikmati buku itu! Terima kasih telah merilisnya!
JonasJSchreiber
Terima kasih telah menikmati buku Java Persistence Kinerja Tinggi saya .
Vlad Mihalcea
Ini ~ JPA adalah antarmuka sementara Hibernate adalah implementasinya
Eddie B
57

Dari Wiki .

Motivasi untuk membuat Java Persistence API

Banyak pengembang Java perusahaan menggunakan objek persisten ringan yang disediakan oleh kerangka kerja sumber terbuka atau Objek Akses Data alih-alih kacang entitas: kacang entitas dan kacang perusahaan memiliki reputasi terlalu berat dan rumit, dan orang hanya dapat menggunakannya di server aplikasi Java EE. Banyak fitur kerangka kegigihan pihak ketiga dimasukkan ke dalam Java Persistence API, dan pada tahun 2006 proyek seperti Hibernate (versi 3.2) dan Versi Open-Source TopLink Essentials telah menjadi implementasi dari Java Persistence API.

Sebagaimana diceritakan di halaman JCP tautan Eclipse adalah Implementasi Referensi untuk JPA. Lihat jawaban ini untuk sedikit lebih banyak tentang ini.

JPA sendiri memiliki fitur yang akan menggantikan kerangka kerja ORM standar. Karena JPA adalah bagian dari spesifikasi Java EE, Anda dapat menggunakan JPA sendiri dalam sebuah proyek dan itu harus bekerja dengan Server Java EE yang kompatibel . Ya, server ini akan memiliki implementasi untuk spesifikasi JPA.

Hibernate adalah kerangka kerja ORM paling populer , setelah JPA diperkenalkan hibernate sesuai dengan spesifikasi JPA . Terlepas dari serangkaian dasar spesifikasi yang harusnya mengikuti hibernate menyediakan banyak hal tambahan.

ManuPK
sumber
3
Yang mengatakan Anda dapat menggunakan JPA sendiri dalam suatu proyek. ?? Apakah maksud Anda tanpa menggunakan Hibernate, TopLink atau implementasi JPA lainnya?
abbas
2
@ abbas ya. Spesifikasi Java EE hanya menggunakan JPA. Jika Anda menambahkan hibernasi, ini memberikan beberapa fitur tambahan.
ManuPK
1
Saya mendengar JPA hanya antarmuka / spesifikasi. Jika kita menggunakan JPA sendiri dalam sebuah proyek, lalu dari mana ia mendapatkan implementasinya?
abbas
@ abas terima kasih atas komentarnya. Saya telah menambahkan lebih detail dalam jawabannya. Semoga ini membantu.
ManuPK
1
@Forhad Selalu perlu ada implementasi, apakah itu terkubur dalam beberapa arsitektur server atau tidak, tidak ada cara untuk hanya mengunduh beberapa perpustakaan JPA dan menjalankannya untuk Anda.
Kevin Bowersox
15

JPA hanyalah spesifikasi yang membutuhkan implementasi konkret. The oracle implementasi default adalah "Eclipselink" sekarang. (Toplink disumbangkan oleh Oracle ke Eclipse foundation untuk bergabung dengan eclipselink)

(Referensi: http://www.oracle.com/technetwork/middleware/toplink/index-085257.html http://www.eclipse.org/org/press-release/20080317_Eclipselink.php )

Menggunakan Eclipselink, orang dapat memastikan bahwa kode tersebut portabel untuk implementasi apa pun jika perlu. Hibernate juga merupakan implementasi JPA penuh + MORE (Sort of JPA Plus). Hibernate adalah perangkat super JPA dengan beberapa fungsi khusus Hibernate tambahan. Jadi aplikasi yang dikembangkan di Hibernate mungkin tidak kompatibel ketika beralih ke implementasi lainnya. Masih hibernate adalah pilihan mayoritas pengembang sebagai implementasi JPA dan banyak digunakan.

Implementasi JPA lainnya adalah OpenJPA (openjpa.apache.org) yang merupakan perpanjangan dari implementasi Kodo.

supernova
sumber
15

JPA: seperti antarmuka dan tidak memiliki implementasi konkret untuk menggunakan fungsi yang ada di JPA.

Hibernate: hanyalah Penyedia JPA yang memiliki implementasi fungsi-fungsi di JPA dan dapat memiliki beberapa fungsi tambahan yang mungkin tidak ada di JPA.

TIP: Anda dapat menggunakan

     *combo 1* : JPA + JPA Provider(Hibernate) 
     *combo 2* : only Hiberante which does not need any interface 

Combo 1 : digunakan ketika Anda merasa bahwa hibernate Anda tidak memberikan kinerja yang lebih baik dan ingin mengubah Penyedia JPA saat itu Anda tidak perlu menulis JPA Anda sekali lagi. Anda dapat menulis Penyedia JPA lain ... dan dapat berubah sesering mungkin.

Combo 2 : digunakan sangat sedikit seperti ketika Anda tidak akan mengubah Penyedia JPA Anda dengan biaya berapa pun.

Kunjungi http://blog-tothought.rhcloud.com//post/2 , di mana kebingungan Anda akan menjadi jelas.

vkrishna17
sumber
11

JPA adalah antarmuka, Hibernate adalah salah satu implementasi dari antarmuka itu.

Thiago Burgos
sumber
2
dan di atas itu Hibernate menambahkan beberapa fitur / metode.
rai.skumar
5

JPA hanyalah sebuah spesifikasi. Di pasar ada banyak vendor yang mengimplementasikan JPA. Berbagai jenis vendor menerapkan JPA dengan cara yang berbeda. jadi berbagai jenis vendor memberikan fungsi yang berbeda, jadi pilih vendor yang tepat berdasarkan kebutuhan Anda.

Jika Anda menggunakan Hibernate atau vendor lain alih-alih JPA daripada Anda tidak dapat dengan mudah pindah ke hibernate ke EclipseLink atau OpenJPA ke Hibernate.Tapi jika Anda menggunakan JPA maka Anda hanya perlu mengubah ketersediaan file XML persisten. Jadi migrasi dengan mudah mungkin dilakukan di JPA.

sus007
sumber
4

JPA adalah API, yang diterapkan Hibernate.Hibernate mendahului JPA. Sebelum JPA, Anda menulis kode hibernate asli untuk melakukan ORM Anda. JPA hanyalah antarmuka, jadi sekarang Anda menulis kode JPA dan Anda perlu menemukan implementasi. Hibernate merupakan implementasi.

Jadi pilihan Anda adalah ini: hibernate, toplink, dll ...

Keuntungan bagi JPA adalah memungkinkan Anda untuk menukar implementasi Anda jika perlu. Kerugiannya adalah bahwa asli hibernate / toplink / etc ... API dapat menawarkan fungsionalitas yang tidak didukung spesifikasi JPA.

Vanishree Gv
sumber
4

Sementara JPA adalah spesifikasi, Hibernate adalah penyedia implementasi yang mengikuti aturan yang ditentukan dalam spesifikasi.

javier Zanetti
sumber
3

Java - kemerdekaannya tidak hanya dari sistem operasi, tetapi juga dari vendor.

Oleh karena itu, Anda harus dapat menggunakan aplikasi Anda di server aplikasi yang berbeda. JPA diimplementasikan di server aplikasi Java EE-compliant dan memungkinkan untuk bertukar server aplikasi, tetapi kemudian implementasinya juga berubah. Aplikasi Hibernate mungkin lebih mudah untuk digunakan pada server aplikasi yang berbeda.

Tijms Arjan
sumber
3

JPA adalah spesifikasi yang Anda terapkan di lapisan data Anda untuk melakukan operasi db, ATAU pemetaan dan tugas-tugas lain yang diperlukan.

Karena itu hanya spesifikasi , Anda memerlukan alat untuk mengimplementasikannya. Alat itu bisa berupa Hibernate, TopLink, iBatis, spring-data dll.

Anda tidak perlu memerlukan JPA jika Anda menggunakan Hibernate di Lapisan Data Anda. Tetapi jika Anda menggunakan spesifikasi JPA untuk Hibernate, maka itu akan membuat beralih ke alat ORM lain seperti iBatis, TopLink mudah di masa depan, karena spesifikasi tersebut juga umum untuk orang lain.

* ( jika Anda ingat, Anda lakukan import javax.persistence.*;ketika Anda menggunakan anotasi untuk pemetaan ATAU (seperti @Id, @Column, @GeneratedValue dll.) di Hibernate, di situlah Anda menggunakan JPA di bawah Hibernate, Anda dapat menggunakan @Query JPA & fitur lain sebagai baik )

Arun Raaj
sumber
2

JPA adalah spesifikasi Java API yang menjelaskan pengelolaan data relasional dalam aplikasi yang menggunakan Java Platform. sedangkan Hibernate adalah perpustakaan ORM (Object Relational Mapping) yang mengikuti spesifikasi JPA.

Anda dapat menganggap JPA sebagai seperangkat Aturan yang diterapkan oleh Hibernate.

Badal
sumber
2

JPA adalah JSR yaitu Persyaratan Spesifikasi Java untuk mengimplementasikan Pemetaan Relasional Objek yang tidak memiliki kode khusus untuk implementasinya. Ini mendefinisikan seperangkat aturan tertentu untuk mengakses, bertahan dan mengelola data antara objek Java dan database relasional. Dengan diperkenalkannya, EJB diganti karena dikritik karena menjadi kelas berat oleh komunitas pengembang Java. Hibernate adalah salah satu cara JPA dapat diimplementasikan dengan menggunakan pedoman te. Hibernate adalah Object / relasional persistensi dan layanan query berkinerja tinggi yang dilisensikan di bawah open source. Lisensi Umum Publik (LGPL). dapat menukar implementasi HiPAate dari JPA untuk implementasi lain dari spesifikasi JPA.

codechefvaibhavkashyap
sumber
1

JPA hanyalah spesifikasi yang membutuhkan implementasi konkret. Implementasi default yang disediakan oleh oracle adalah "Eclipselink" sekarang. Toplink disumbangkan oleh Oracle ke Eclipse foundation untuk bergabung dengan eclipselink.

Menggunakan Eclipselink, orang dapat memastikan bahwa kode tersebut portabel untuk implementasi apa pun jika perlu. Hibernate juga merupakan implementasi JPA penuh + LEBIH. Hibernate adalah perangkat super JPA dengan beberapa fungsi khusus Hibernate tambahan. Jadi aplikasi yang dikembangkan di Hibernate mungkin tidak kompatibel ketika beralih ke implementasi lain. Masih hibernate adalah pilihan mayoritas pengembang sebagai implementasi JPA dan banyak digunakan.

Implementasi JPA lainnya adalah OpenJPA, yang merupakan perpanjangan dari implementasi Kodo.

JPA vs Hibernate


sumber
1

Saya mencoba menjelaskan dengan kata-kata yang sangat mudah.

Misalkan Anda membutuhkan mobil seperti yang kita semua tahu ada beberapa produsen kelas A seperti MERCEDES, BMW, AUDI dll.

Sekarang dalam pernyataan di atas CAR (adalah spesifikasi) karena setiap mobil memiliki fitur umum seperti benda dengan 4 roda dan dapat dikendarai di jalan adalah mobil ... jadi seperti JPA. Dan MERCEDES, BMW, AUDI dll hanya menggunakan fitur mobil umum dan menambahkan fungsi sesuai dengan basis pelanggan mereka sehingga mereka menerapkan spesifikasi mobil seperti hibernate, iBATIS dll.

Jadi dengan fitur-fitur umum ini pergi ke jpa dan hibernate hanyalah implementasi sesuai dengan kebutuhan JBoss mereka.

1 hal lagi

JPA menyertakan beberapa properti dasar sehingga di masa depan jika Anda ingin mengubah hibernate ke implementasi lain Anda dapat dengan mudah beralih tanpa banyak sakit kepala dan untuk properti-properti dasar tersebut termasuk anotasi JPA yang dapat bekerja untuk teknologi implementasi apa pun, permintaan JPQL.

Jadi terutama kami menerapkan hibernate dengan teknologi tipe JPA hanya untuk berjaga-jaga jika kami ingin beralih implementasi kami sesuai dengan kebutuhan klien ditambah Anda akan menulis lebih sedikit kode karena beberapa fitur umum yang terlibat dalam JPA. Jika seseorang masih tidak jelas maka Anda dapat berkomentar sebagai saya baru di stack overflow.

Terima kasih

rajiv baghel
sumber
Terima kasih atas sarannya
rajiv baghel
0

JPA hanyalah spesifikasi sementara Hibernate adalah salah satu penyedia JPA yaitu hibernate mengimplementasikan berbagai hal yang disebutkan dalam kontrak JPA.

pengguna1157635
sumber
0

JPA atau Java Persistence API adalah spesifikasi standar untuk implementasi ORM sedangkan Hibernate adalah implementasi atau kerangka kerja ORM yang sebenarnya.

Amit Gujarathi
sumber
-1

JPA adalah Java Persistence API. Yang Menentukan hanya spesifikasi untuk API. Berarti seperangkat aturan dan pedoman untuk membuat API. Jika mengatakan konteks lain, Kumpulan standar yang menyediakan pembungkus untuk membuat API tersebut, dapat digunakan untuk mengakses objek entitas dari basis data. JPA disediakan oleh oracle. Ketika kita akan melakukan akses database, kita pasti membutuhkan implementasinya. Berarti JPA hanya menentukan pedoman untuk mengimplementasikan API. Hibernate adalah penyedia / Vendor JPA yang bertanggung jawab untuk mengimplementasikan API tersebut. Seperti Hibernate TopLink dan Open JPA adalah beberapa contoh penyedia API JPA. Jadi kami menggunakan API standar yang ditentukan JPA melalui hibernate.

Mr.DevEng
sumber
-2

JPA secara kiasan berbicara hanya antarmuka, Hibernate / TopLink - kelas (yaitu implementasi antarmuka).

Anda harus memiliki implementasi antarmuka untuk menggunakan antarmuka. Tetapi Anda dapat menggunakan kelas melalui antarmuka, yaitu Gunakan Hibernate melalui JPA API atau Anda dapat menggunakan implementasi secara langsung, yaitu menggunakan Hibernate secara langsung, bukan melalui API JPA murni.

Buku bagus tentang JPA adalah "Java High Performance-Persistence" dari Vlad Mihalcea.

Anton Tupy
sumber