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?
Jawaban:
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 .
sumber
org.hibernate
anotasi. lebih lanjut tentang iniJPA adalah tariannya, Hibernate adalah penari.
sumber
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/
sumber
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 :
@SQLInsert
,@SQLUpdate
,@SQLDelete
) pernyataan@FilterDef
.@Filter
,@Where
) dan filter entitas (mis.@Where
)@Formula
)@Immutable
)FlushMode.MANUAL
,FlushMode.ALWAYS
)Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
)@OptimisticLock(excluded = true)
)OptimisticLockType.ALL
,OptimisticLockType.DIRTY
)@Where
,@Filter
)Fitur-fitur tambahan ini memungkinkan Hibernate untuk mengatasi banyak persyaratan persistensi yang diminta oleh aplikasi perusahaan besar.
sumber
Dari Wiki .
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.
sumber
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.
sumber
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 : 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.
sumber
JPA adalah antarmuka, Hibernate adalah salah satu implementasi dari antarmuka itu.
sumber
JPA adalah spesifikasi untuk menstandarisasi ORM-API. Hibernate adalah vendor implementasi JPA. Jadi jika Anda menggunakan JPA dengan hibernate, Anda dapat menggunakan API JPA standar, hibernate akan berada di bawah tenda, menawarkan beberapa fungsi yang lebih non standar. Lihat http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html_single/ dan http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/
sumber
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.
sumber
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.
sumber
Sementara JPA adalah spesifikasi, Hibernate adalah penyedia implementasi yang mengikuti aturan yang ditentukan dalam spesifikasi.
sumber
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.
sumber
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 )sumber
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.
sumber
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.
sumber
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
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
sumber
JPA hanyalah spesifikasi sementara Hibernate adalah salah satu penyedia JPA yaitu hibernate mengimplementasikan berbagai hal yang disebutkan dalam kontrak JPA.
sumber
JPA atau Java Persistence API adalah spesifikasi standar untuk implementasi ORM sedangkan Hibernate adalah implementasi atau kerangka kerja ORM yang sebenarnya.
sumber
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.
sumber
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.
sumber