Apa perbedaan utama antara Hibernate dan Spring Data JPA? Kapan kita tidak menggunakan Hibernate atau Spring Data JPA? Selain itu, kapan templat JDBC Spring berkinerja lebih baik dari Hibernate / Spring Data JPA?
Apa perbedaan utama antara Hibernate dan Spring Data JPA? Kapan kita tidak menggunakan Hibernate atau Spring Data JPA? Selain itu, kapan templat JDBC Spring berkinerja lebih baik dari Hibernate / Spring Data JPA?
Jawaban:
Hibernate adalah implementasi JPA, sedangkan Spring Data JPA adalah abstraksi akses data JPA. Spring Data JPA tidak dapat bekerja tanpa penyedia JPA.
Spring Data menawarkan solusi untuk pola DDDRepository
atau GenericDao
implementasi kustom lama . Itu juga dapat menghasilkan permintaan JPA atas nama Anda melalui konvensi nama metode.
Dengan Data Spring, Anda dapat menggunakan Hibernate, Eclipse Link, atau penyedia JPA lainnya. Manfaat yang sangat menarik dari menggunakan Spring atau Java EE adalah bahwa Anda dapat mengontrol batas-batas transaksi secara deklaratif menggunakan @Transactional
anotasi .
Spring JDBC jauh lebih ringan, dan ini dimaksudkan untuk query asli, dan jika Anda hanya ingin menggunakan JDBC saja, maka Anda lebih baik menggunakan Spring JDBC untuk berurusan dengan verbositas JDBC.
Oleh karena itu, Hibernate dan Spring Data lebih komplementer daripada pesaing.
Ada 3 hal berbeda yang kami gunakan di sini:
Jadi mari kita mengerti caranya data pegas jpa dan pegas + hibernasi berfungsi-
Katakanlah Anda menggunakan spring + hibernate untuk aplikasi Anda. Sekarang Anda harus memiliki antarmuka dao dan implementasi di mana Anda akan menulis operasi crud menggunakan SessionFactory of hibernate. Katakanlah Anda menulis kelas dao untuk kelas Karyawan, besok di aplikasi Anda, Anda mungkin perlu menulis operasi crud yang serupa untuk entitas lain. Jadi ada banyak kode boilerplate yang bisa kita lihat di sini.
Sekarang data Spring jpa memungkinkan kita untuk mendefinisikan antarmuka dao dengan memperluas repositorienya (crudrepository, jparepository) sehingga memberikan Anda implementasi dao saat runtime. Anda tidak perlu lagi menulis implementasi dao. Itulah bagaimana spring data jpa membuat hidup Anda mudah.
Saya tidak setuju SpringJPA membuat hidup mudah. Ya, ini menyediakan beberapa kelas dan Anda dapat membuat beberapa DAO cepat sederhana, tetapi pada kenyataannya, itu semua yang dapat Anda lakukan. Jika Anda ingin melakukan sesuatu lebih dari findById () atau menyimpan, Anda harus melalui neraka:
Mengapa manajemen transaksi sendiri merupakan kerugian? Karena Java 1.8 memungkinkan metode standar ke antarmuka, transaksi berbasis anotasi Spring, sederhana tidak berfungsi.
Sayangnya, SpringJPA didasarkan pada refleksi, dan kadang-kadang Anda perlu menunjukkan nama metode atau paket entitas ke dalam anotasi (!). Itu sebabnya setiap refactoring membuat kehancuran besar. Sayangnya, @Transaksional hanya berfungsi untuk DS primer :( Jadi, jika Anda memiliki lebih dari satu Sumber Data, ingat - transaksi hanya berfungsi untuk yang primer :)
Apa perbedaan utama antara Hibernate dan Spring Data JPA?
Hibernate kompatibel dengan JPA, SpringJPA Spring kompatibel. HibernateJPA DAO Anda dapat digunakan dengan JavaEE atau Hibernate Standalone, ketika SpringJPA dapat digunakan dalam Spring - SpringBoot misalnya
Kapan kita tidak menggunakan Hibernate atau Spring Data JPA? Selain itu, kapan templat JDBC Spring berkinerja lebih baik dari Hibernate / Spring Data JPA?
Gunakan Spring JDBC hanya ketika Anda perlu menggunakan banyak Bergabung atau ketika Anda perlu menggunakan Spring memiliki beberapa koneksi sumber data. Secara umum, hindari JPA untuk Bergabung.
Tetapi saran umum saya, gunakan solusi segar — Daobab ( http://www.daobab.io ). Daobab adalah Java saya dan integrator engine JPA saya, dan saya percaya ini akan banyak membantu dalam tugas Anda :)
Spring Data
adalah perpustakaan praktis di atas JPA
yang abstrak banyak hal dan membawa sihir Spring (suka atau tidak) ke akses toko kegigihan. Ini terutama digunakan untuk bekerja dengan database relasional. Singkatnya, ini memungkinkan Anda untuk mendeklarasikan antarmuka yang memiliki metode seperti findByNameOrderByAge(String name);
itu akan diuraikan dalam runtime dan dikonversi menjadi JPA
permintaan yang sesuai .
Penempatannya di atas JPA
membuat penggunaannya menggoda untuk:
Pengembang pemula yang tidak tahu SQL
atau mengetahuinya dengan buruk. Ini adalah resep untuk bencana tetapi mereka bisa lolos jika proyek itu sepele.
Insinyur berpengalaman yang tahu apa yang mereka lakukan dan ingin mempercepat hal-hal. Ini mungkin strategi yang layak (tetapi baca lebih lanjut).
Dari pengalaman saya dengan Spring Data
, sihirnya terlalu banyak (ini berlaku Spring
secara umum). Saya mulai sering menggunakannya dalam satu proyek dan akhirnya menabrak beberapa kasus sudut di mana saya tidak bisa mendapatkan perpustakaan keluar dari jalan saya dan berakhir dengan penyelesaian yang buruk. Kemudian saya membaca keluhan pengguna lain dan menyadari bahwa masalah ini tipikal untuk Spring Data
. Sebagai contoh, periksa masalah ini yang menyebabkan jam investigasi / sumpah:
public TourAccommodationRate createTourAccommodationRate(
@RequestBody TourAccommodationRate tourAccommodationRate
) {
if (tourAccommodationRate.getId() != null) {
throw new BadRequestException("id MUST NOT be specified in a body during entry creation");
}
// This is an ugly hack required for the Room slim model to work. The problem stems from the fact that
// when we send a child entity having the many-to-many (M:N) relation to the containing entity, its
// information is not fetched. As a result, we get NPEs when trying to access all but its Id in the
// code creating the corresponding slim model. By detaching the entity from the persistence context we
// force the ORM to re-fetch it from the database instead of taking it from the cache
tourAccommodationRateRepository.save(tourAccommodationRate);
entityManager.detach(tourAccommodationRate);
return tourAccommodationRateRepository.findOne(tourAccommodationRate.getId());
}
Saya akhirnya pergi ke tingkat yang lebih rendah dan mulai menggunakan JDBI
- perpustakaan yang bagus dengan "sihir" yang cukup untuk menyelamatkan Anda dari boilerplate. Dengan itu, Anda memiliki kontrol penuh atas permintaan SQL dan hampir tidak pernah harus melawan perpustakaan.
Hibernate adalah implementasi dari "JPA" yang merupakan spesifikasi untuk objek Java di Database.
Saya akan merekomendasikan untuk menggunakan wrt JPA karena Anda dapat beralih di antara ORMS yang berbeda.
Ketika Anda menggunakan JDBC maka Anda perlu menggunakan SQL Queries, jadi jika Anda mahir dalam SQL, maka pergi untuk JDBC.
Jika Anda lebih suka kesederhanaan dan lebih banyak kontrol pada query SQL maka saya akan menyarankan pergi dengan Spring Data / Spring JDBC.
Jumlah kurva pembelajaran yang baik di JPA dan terkadang sulit untuk debug masalah. Di sisi lain, sementara Anda memiliki kontrol penuh atas SQL, menjadi lebih mudah untuk mengoptimalkan permintaan dan meningkatkan kinerja. Anda dapat dengan mudah membagikan SQL Anda dengan DBA atau seseorang yang memiliki pemahaman yang lebih baik tentang Database.