Apa perbedaan antara Hibernate dan Spring Data JPA

207

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?

hard coder
sumber
7
@NeilStockton meminta perbandingan antara dua teknologi tidak meminta pendapat.
Philip Rego

Jawaban:

262

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 GenericDaoimplementasi 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 @Transactionalanotasi .

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.

Vlad Mihalcea
sumber
53
Jadi apakah ini berarti bahwa Spring Data JPA tidak dapat ada dengan sendirinya? Artinya, di bawah tenda, ia menggunakan salah satu penyedia JPA (seperti Hibernate, Eclipselink atau penyedia JPA lainnya)?
CuriousMind
Maksud saya jika saya hanya menggunakan hibernate, ada sedikit konfigurasi untuk level hibernate, Jika saya menggunakan spring data jpa, itu terlihat jauh lebih mudah daripada hibernate. Dalam hal ini saya menanyakan pertanyaan itu kepada Anda.
Asif Mushtaq
1
Lebih tepatnya, sejauh ini semuanya berfungsi dengan baik Anda hanya perlu memahami tingkat atas yaitu Spring Data JPA. Dengan pengecualian pertama Anda berpotensi harus mengetahui level yang lebih rendah yaitu Hibernate, JDBC dan Database.
Marmite Bomber
138

Ada 3 hal berbeda yang kami gunakan di sini:

  1. JPA: Java persistence api yang memberikan spesifikasi untuk bertahan, membaca, mengelola data dari objek java Anda untuk hubungan dalam database.
  2. Hibernate: Ada berbagai penyedia yang mengimplementasikan jpa. Hibernate adalah salah satunya. Jadi kami memiliki penyedia lain juga. Tetapi jika menggunakan jpa dengan pegas itu memungkinkan Anda untuk beralih ke penyedia yang berbeda di masa depan.
  3. Spring Data JPA: Ini adalah layer lain di atas jpa yang disediakan pegas untuk memudahkan hidup Anda.

Jadi mari kita mengerti caranya data pegas jpa dan pegas + hibernasi berfungsi-


Spring Data JPA:

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.

Bhagwati Malav
sumber
3
Jadi apa implementasi yang mendasari Spring Data JPA, apakah hibernasi? karena ketika saya menggunakan PagingAndSortingRepository, ini menunjukkan log Hibernate di konsol.
Vicky
2
Spring Data JPA menggunakan implementasi Hibernate secara default .. Jika Anda melihat dependensi transitif dari spring-boot-starter-data-jpa, Anda dapat melihat hibernate-core di sana
IamVickyAV
28

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:

  • tidak ada akses EntityManager di kelas org.springframework.data.repository (ini adalah kelas JPA dasar!)
  • manajemen transaksi sendiri (transaksi hibernasi tidak diizinkan)
  • masalah besar dengan lebih dari satu konfigurasi sumber data
  • tidak ada pengumpulan sumber data (HikariCP harus digunakan sebagai perpustakaan pihak ketiga)

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 :)

Klaudiusz Wojtkowiak
sumber
2
Daobab, benarkah? Jika Anda tidak suka jpql seperti jenis keamanan (saya tidak), JPA memiliki API kriteria aman jenis ... Standar JPA lebih baik daripada alternatif yang buruk.
ymajoros
8

Spring Dataadalah perpustakaan praktis di atas JPAyang 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 JPApermintaan yang sesuai .

Penempatannya di atas JPAmembuat penggunaannya menggoda untuk:

  1. Pengembang pemula yang tidak tahu SQLatau mengetahuinya dengan buruk. Ini adalah resep untuk bencana tetapi mereka bisa lolos jika proyek itu sepele.

  2. 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 Springsecara 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.

raiks
sumber
ini adalah jawaban yang bagus tetapi jika Anda bisa menuliskan daftar kasus dan memerinci lebih lanjut, itu akan sangat membantu. Itu akan menjadi Jawaban yang Hebat. Terima kasih
John
Yah, itu tidak mudah untuk mengingat yang diberikan bahwa saya belum pernah bekerja dengan Spring Data cukup lama - saya harus memeriksa kode lama dan akan menambahkan lebih banyak komentar. Namun, salah satu gangguan langsung dari kepala saya - di JPA sangat sering objek harus saling referensi (misalnya untuk operasi berjenjang). Hal ini menyebabkan kesalahan Stack Overflow (karena referensi melingkar) ketika Spring mencoba untuk membuat serial mereka memaksa Anda untuk mengutak-atik jelek / solusi. Masalah ini bersinggungan dengan Data Spring meskipun karena ini adalah masalah JPA. Namun, karena JPA mendasari Data Spring Anda mendapatkannya "gratis".
raiks
Mengedit pos dan menambahkan satu contoh lagi.
raiks
1

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.

Thoopalliamar
sumber
1

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.

GPopat
sumber