Apa perbedaan Spring Data JPA dari Hibernate untuk proyek besar?

129

Saya mengalami kesulitan memutuskan apakah saya harus tetap dengan Hibernate untuk proyek baru, atau membuat saya basah dengan JPA dan implementasi Data Spring baru.

Apakah kerangka kerja Data Spring ditujukan untuk proyek besar atau proyek kecil dengan persyaratan kueri sederhana?

Meskipun saya pasti melihat keuntungan dalam pengurangan kode dengan menggunakan @Queryanotasi, apa yang Anda lakukan untuk permintaan dinamis? Bagaimana ketika Anda ingin menerapkan metode save () yang cukup rumit?

Dokumentasi mengatakan untuk membuat antarmuka Custom dan implementasi yang mengimplementasikan repositori utama Anda, tetapi bagaimana jika Anda perlu mengakses metode super apa pun pada repositori crud itu sendiri? Repositori crud mengimplementasikan yang kustom - bukan sebaliknya. Sepertinya desain yang aneh.

Saya sangat tidak yakin apakah kerangka kerja ini akan memenuhi tantangan aplikasi yang kompleks dan besar. Saya tidak pernah mengalami banyak masalah dengan Hibernate, dan saya mempertimbangkan untuk tetap menggunakan yang lama dan andal daripada menggunakan Spring Data JPA.

Apa yang harus saya lakukan? Apa komplikasi dan biaya yang tidak terduga yang akan saya temui jika saya menggunakan Spring Data JPA?

egervari
sumber
1
Sejauh yang saya tahu, itu membuat sedikit perbedaan. Pergilah dengan yang Anda merasa lebih nyaman. Kenapa berdebat?
duffymo
1
Saya jelas jauh lebih nyaman dengan Hibernate, tetapi jika saya bisa melakukan hal yang sama dan menjadi lebih produktif, saya lebih suka mengadopsi pendekatan yang lebih baru. Namun, jika Hibernate masih lebih kuat dan saya akan menghadapi masalah yang jauh lebih sedikit, maka itu adalah sesuatu yang ingin saya ketahui.
egervari
3
JPA adalah generalisasi dari ORM yang menggunakan Hibernate sebagai salah satu dari banyak implementasi. Kekuatan apa yang Anda kaitkan satu dengan yang lain? JPA adalah standar, tetapi saya melihat sedikit perbedaan antara keduanya. Untuk kepentingan pengungkapan penuh, saya akan mengatakan bahwa saya tidak peduli dengan keduanya. Keduanya menghasilkan SQL untuk Anda. Saya lebih suka menulis sendiri. ORM bukan untuk setiap masalah dan setiap pengguna.
duffymo
1
Saya setuju. Ketika datang ke JPA atau Hibernate saja, saya akan memilih Hibernate setiap waktu. Sejujurnya saya tidak terlalu suka implementasi JPA. Dukungan IDE di IDEA sebenarnya masih agak buruk, dan itu akan mengeluh jika pemetaan tidak benar ketika aplikasi dimulai daripada membiarkan tes unit berjalan. Ada banyak nitpicks lain yang saya miliki dengan JPA. Saya sebenarnya agak menikmati file pemetaan XML Hibernate lama. Ini memiliki keuntungan membuat benda saya terlihat jauh lebih tidak berantakan juga. Spring Data JPA menawarkan banyak fitur baru, jadi saya akhirnya bertanya-tanya apakah nilainya untuk beralih.
egervari
3
"Data Musim Semi" bukan merupakan implementasi JPA, atau apa pun. Ini hanya membutuhkan implementasi JPA yang ada dan menyederhanakan apa yang Anda berikan untuk itu. Implementasi JPA masih melakukan semua pekerjaan di bawah selimut
Neil Stockton

Jawaban:

104

Jadi, spring-datalakukan beberapa sihir tambahan yang membantu dengan pertanyaan kompleks. Ini aneh pada awalnya dan Anda benar-benar melewatkannya di dokumen tetapi sangat kuat dan berguna.

Ini melibatkan pembuatan custom Repositorydan `RepositoryImpl 'kustom dan memberitahu Spring di mana menemukannya. Berikut ini sebuah contoh:

Kelas konfigurasi - arahkan ke konfigurasi xml Anda yang masih dibutuhkan dengan anotasi yang menunjuk ke paket repositori Anda (sekarang mencari *Implkelas secara otomatis):

@Configuration
@EnableJpaRepositories(basePackages = {"com.examples.repositories"})
@EnableTransactionManagement
public class MyConfiguration {
}

jpa-repositories.xml - beri tahu di Springmana menemukan repositori Anda. Katakan juga Springuntuk mencari repositori khusus dengan CustomImplnama file:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<jpa:repositories base-package="com.example.repositories" repository-impl-postfix="CustomImpl" />

</beans>

MyObjectRepository- ini adalah tempat Anda dapat memasukkan metode kueri beranotasi dan tidak berotot. Perhatikan bagaimana antarmuka repositori ini memperluasnya Custom:

@Transactional
public interface MyObjectRepository extends JpaRepository<MyObject, Integer>, MyObjectRepositoryCustom {

    List<MyObject> findByName(String name);

    @Query("select * from my_object where name = ?0 or middle_name = ?0")
    List<MyObject> findByFirstNameOrMiddleName(String name);
}

MyObjectRepositoryCustom - metode repositori yang lebih kompleks dan tidak dapat ditangani dengan permintaan sederhana atau anotasi:

public interface MyObjectRepositoryCustom {

    List<MyObject> findByNameWithWeirdOrdering(String name);
}

MyObjectRepositoryCustomImpl- di mana Anda benar-benar menerapkan metode-metode itu dengan autowired EntityManager:

public class MyObjectRepositoryCustomImpl implements MyObjectRepositoryCustom {

    @Autowired
    private EntityManager entityManager;

    public final List<MyObject> findByNameWithWeirdOrdering(String name) {
        Query query = query(where("name").is(name));
        query.sort().on("whatever", Order.ASC);
        return entityManager.find(query, MyObject.class);
    }
}

Hebatnya, ini semua datang bersama-sama dan metode dari kedua antarmuka (dan antarmuka CRUD, Anda menerapkan) semua muncul ketika Anda melakukannya:

myObjectRepository.

Kamu akan lihat:

myObjectRepository.save()
myObjectRepository.findAll()
myObjectRepository.findByName()
myObjectRepository.findByFirstNameOrMiddleName()
myObjectRepository.findByNameWithWeirdOrdering()

Ini benar-benar bekerja. Dan Anda mendapatkan satu antarmuka untuk query. spring-databenar-benar siap untuk aplikasi besar. Dan semakin banyak pertanyaan yang bisa Anda buat menjadi sederhana atau anotasi, semakin baik Anda.

Semua ini didokumentasikan di situs Spring Data Jpa .

Semoga berhasil.

sbzoom
sumber
4
Ini sebenarnya yang saya coba, dan berhasil sampai batas tertentu. Masalah yang saya miliki adalah bagaimana jika Anda ingin menimpa save ()? Misalnya, bayangkan Anda menyimpan blog, dan Anda ingin memproses / menyimpan tag yang terkait dengannya dalam metode save () karena memasukkannya ke dalam layanan tidak masuk akal. Ini mudah dilakukan dengan Hibernate mentah, tapi saya tidak melihat cara yang baik untuk melakukan dengan Spring JPA. Saya akan menandai jawaban Anda sebagai benar karena itu benar. Pada dasarnya itulah yang dapat Anda lakukan dengan Spring Data JPA. Saya pikir saya akan tetap dengan Hibernate. Jawaban ini pasti akan membantu orang lain.
egervari
8
Anda dapat menerapkan sendiri JpaRepository-> MyJpaRepository. Anda juga harus membuat MyJpaRepositoryFactoryBeantetapi jika Anda mengatur semuanya dengan benar, Anda dapat mengganti metode .save (). Berikut adalah Data Spring JPA Documents: static.springsource.org/spring-data/data-jpa/docs/current/… Jangan menyerah dulu!
sbzoom
@Picrochole bagaimana Anda mengartikan 'aplikasi tingkat bawah'? Apakah layanan, yang memanggil DAO lebih rendah di tingkat?
Rumid
12

Saya telah menggunakan Spring Data JPA dalam proyek kecil dan besar dengan permintaan kueri sederhana. Keuntungan utama adalah dari tidak harus menggunakan @Queryanotasi. Tidak ada dalam Data Spring yang mencegah Anda menggunakannya dalam proyek-proyek besar dan QueryDSLdukungan terbaru mungkin membantu Anda. Ini adalah contoh menggunakan QueryDSL untuk menargetkan Hibernate.

Jika Anda melihat pertanyaan kompleks dan Anda merasa nyaman menggunakan objek Hibernate tanpa JPA Saya pikir kombinasi alternatif bisa memiliki Spring Data sederhana Repositorydi sebelah yang kompleks berbasis Hibernate dengan metode spesifik yang mungkin Anda butuhkan. Mungkin kurang rumit jika memutar implementasi Hibernate ke struktur Spring Data JPA.

madth3
sumber
2
Saya pikir saya lebih suka menggunakan api konsisten yang sama untuk permintaan daripada mencampur dan mencocokkan dalam proyek yang sama. Saya masih belum menemukan solusi yang baik untuk data jpa data pegas yang kompleks, dan karena ada beberapa nitpicks dengan jpa yang saya miliki secara umum, saya pikir saya mungkin lebih senang menerima hibernate sebagai orm saya. Saya akan memiliki banyak pertanyaan kompleks, dan saya tidak mampu memiliki campuran 40/60. Ini tidak layak untuk saya :(
egervari
1
Anda juga dapat menggunakan Querydsl secara langsung tanpa Data Musim Semi yang memberi Anda satu lapisan kueri yang kuat di atas JPA.
Timo Westkämper
4

Spring JPA akan memberi Anda banyak abstraksi dari penulisan SQL dan bahkan beberapa HQL menggunakan deklarasi metode kueri. Spring JPA bersinar dengan pembuatan kueri, tetapi ketika Anda menginginkan solusi hibernasi murni, Anda dapat menyesuaikan sesuai kebutuhan karena spring JPA masih berbasis pada hibernate. Periksa dokumen http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html untuk info lebih lanjut.

FOO
sumber