Saya kenal dengan ORM sebagai konsep, dan saya bahkan menggunakan nHibernate beberapa tahun yang lalu untuk proyek .NET; Namun, saya belum mengikuti topik ORM di Jawa dan belum memiliki kesempatan untuk menggunakan salah satu alat ini.
Tapi, sekarang saya mungkin memiliki kesempatan untuk mulai menggunakan beberapa alat ORM untuk salah satu aplikasi kami, dalam upaya untuk menjauh dari serangkaian layanan web lama.
Saya mengalami kesulitan mengatakan perbedaan antara spesifikasi JPA, apa yang Anda dapatkan dengan perpustakaan Hibernate itu sendiri, dan apa yang ditawarkan JDO.
Jadi, saya mengerti bahwa pertanyaan ini agak terbuka, tetapi saya berharap untuk mendapatkan beberapa pendapat tentang:
- Apa pro dan kontra dari masing-masing?
- Mana yang akan Anda sarankan untuk proyek baru?
- Apakah ada kondisi tertentu saat menggunakan satu kerangka kerja vs yang lain?
Pastikan Anda mengevaluasi implementasi DataNucleus dari JDO. Kami mulai dengan Hibernate karena tampaknya sangat populer tetapi segera menyadari bahwa itu bukan solusi persistensi transparan 100%. Ada terlalu banyak peringatan dan dokumentasi penuh 'jika Anda memiliki situasi ini maka Anda harus menulis kode Anda seperti ini' yang menghilangkan kesenangan dari pemodelan dan pengkodean bebas seperti yang kita inginkan. JDO tidak pernah membuat saya menyesuaikan kode atau model untuk membuatnya berfungsi dengan baik. Saya hanya bisa mendesain dan kode POJO sederhana seolah-olah saya akan menggunakannya 'dalam memori' saja, namun saya bisa bertahan secara transparan.
Keuntungan lain dari JDO / DataNucleus dibandingkan hibernate adalah tidak memiliki semua overhead time run refleksi dan lebih hemat memori karena menggunakan peningkatan kode byte waktu bangun (mungkin menambah 1 detik waktu pembangunan Anda untuk proyek besar) daripada dari pola proksi bertenaga refleksi waktu berjalan hibernate.
Hal lain yang mungkin Anda anggap menjengkelkan dengan Hibernate adalah bahwa referensi yang Anda miliki tentang apa yang Anda pikirkan adalah objek ... sering kali 'proxy' untuk objek tersebut. Tanpa manfaat peningkatan kode byte, pola proxy diperlukan untuk memungkinkan pemuatan berdasarkan permintaan (yaitu menghindari menarik seluruh grafik objek ketika Anda menarik objek level atas). Bersiaplah untuk mengesampingkan sama dan kode hash karena objek yang Anda pikir Anda referensi sering kali hanya proxy untuk objek itu.
Berikut adalah contoh frustrasi yang akan Anda dapatkan dengan Hibernate yang tidak akan Anda dapatkan dengan JDO:
http://blog.andrewbeacock.com/2008/08/how-to-implement-hibernate-safe-equals.html
http://burtbeckwith.com/blog/?p=53
Jika Anda suka coding ke 'workarounds' maka, tentu saja, Hibernate adalah untuk Anda. Jika Anda menghargai pengembangan yang bersih, murni, berorientasi objek, dan digerakkan oleh model di mana Anda menghabiskan seluruh waktu Anda untuk pemodelan, desain, dan pengkodean, dan tidak ada satu pun dari itu untuk solusi yang buruk, maka habiskan beberapa jam untuk mengevaluasi JDO / DataNucleus . Jam yang diinvestasikan akan dibayar seribu kali lipat.
Perbarui Feb 2017
Untuk beberapa waktu sekarang DataNucleus mengimplementasikan standar ketekunan JPA di samping standar ketekunan JDO sehingga porting proyek JPA yang ada dari Hibernate ke DataNucleus harus sangat mudah dan Anda bisa mendapatkan semua manfaat DataNucleus yang disebutkan di atas dengan sedikit perubahan kode , jika ada. Jadi dalam hal pertanyaan, pilihan standar tertentu, JPA (hanya RDBMS) vs JDO (RDBMS + Tidak ada SQL + ODBMS + + lainnya), DataNucleus mendukung keduanya, Hibernate dibatasi hanya untuk JPA.
Kinerja pembaruan DB Hibernate
Masalah lain yang perlu dipertimbangkan ketika memilih ORM adalah efisiensi mekanisme pengecekannya yang kotor - yang menjadi sangat penting ketika perlu membangun SQL untuk memperbarui objek yang telah berubah dalam transaksi saat ini - terutama ketika ada banyak objek. Ada penjelasan teknis rinci tentang mekanisme pemeriksaan kotor Hibernate dalam jawaban SO ini: JPA dengan HIBERNATE masukkan sangat lambat
sumber
Saya baru-baru ini mengevaluasi dan memilih kerangka kerja bertahan untuk proyek java dan temuan saya adalah sebagai berikut:
Apa yang saya lihat adalah bahwa dukungan yang mendukung JDO terutama:
dan dukungan yang mendukung JPA terutama:
Saya melihat banyak posting pro-JPA dari pengembang JPA yang jelas-jelas tidak menggunakan JDO / Datanucleus yang menawarkan argumen yang lemah karena tidak menggunakan JDO.
Saya juga melihat banyak posting dari pengguna JDO yang telah bermigrasi ke JDO dan hasilnya jauh lebih bahagia.
Sehubungan dengan JPA menjadi lebih populer, tampaknya ini sebagian karena dukungan vendor RDBMS daripada yang secara teknis unggul. (Kedengarannya seperti VHS / Betamax bagi saya).
JDO dan implementasi rujukannya Datanucleus jelas tidak mati, seperti yang ditunjukkan oleh adopsi Google untuk GAE dan pengembangan aktif pada kode sumber (http://sourceforge.net/projects/datanucleus/).
Saya telah melihat sejumlah keluhan tentang JDO karena peningkatan bytecode, tetapi belum ada penjelasan mengapa itu buruk.
Bahkan, di dunia yang semakin terobsesi oleh solusi NoSQL, JDO (dan implementasi datanucleus) tampaknya taruhan yang jauh lebih aman.
Saya baru saja mulai menggunakan JDO / Datanucleus dan mengaturnya sehingga saya dapat beralih dengan mudah antara menggunakan db4o dan mysql. Sangat membantu untuk pengembangan cepat untuk menggunakan db4o dan tidak perlu terlalu khawatir tentang skema DB dan kemudian, setelah skema tersebut distabilkan untuk digunakan ke database. Saya juga merasa yakin bahwa nantinya, saya bisa mengerahkan semua / sebagian dari aplikasi saya ke GAE atau memanfaatkan penyimpanan terdistribusi / mengurangi peta a la hbase / hadoop / cassandra tanpa terlalu banyak refactoring.
Saya menemukan rintangan awal untuk memulai dengan Datanucleus sedikit rumit - Dokumentasi di situs web datanucleus agak sulit untuk dipahami - tutorialnya tidak mudah diikuti seperti yang saya inginkan. Karena itu, dokumentasi yang lebih rinci tentang API dan pemetaan sangat baik setelah Anda melewati kurva pembelajaran awal.
Jawabannya, itu tergantung apa yang Anda inginkan. Saya lebih suka memiliki kode yang lebih bersih, opsi no-vendor-lock-in, lebih berorientasi pojo, nosql lebih populer.
Jika Anda ingin perasaan rewel hangat bahwa Anda melakukan hal yang sama dengan mayoritas pengembang lain / domba, pilih JPA / hibernasi. Jika Anda ingin memimpin di bidang Anda, uji drive JDO / Datanucleus dan buat pikiran Anda sendiri.
sumber
Saya tidak akan menyarankan! Gunakan Spring DAO's
JdbcTemplate
bersamaStoredProcedure
,RowMapper
danRowCallbackHandler
sebagai gantinya.Pengalaman pribadi saya sendiri dengan Hibernate adalah bahwa waktu yang dihemat di muka lebih dari diimbangi dengan hari-hari tanpa henti yang akan Anda habiskan untuk mencoba memahami dan men-debug masalah seperti perilaku pembaruan berjenjang yang tidak terduga.
Jika Anda menggunakan DB relasional maka semakin dekat kode Anda, semakin banyak kontrol yang Anda miliki. Lapisan DAO Spring memungkinkan kontrol yang baik dari layer pemetaan, sambil menghilangkan kebutuhan untuk kode boilerplate. Juga, itu terintegrasi ke dalam lapisan transaksi Spring yang berarti Anda dapat dengan mudah menambahkan (melalui AOP) perilaku transaksional yang rumit tanpa mengganggu ke dalam kode Anda (tentu saja, Anda mendapatkan ini dengan Hibernate juga).
sumber
JDO tidak mati sebenarnya jadi silakan periksa fakta Anda. JDO 2.2 dirilis pada Oktober 2008 JDO 2.3 sedang dalam pengembangan.
Ini dikembangkan secara terbuka, di bawah Apache. Lebih banyak rilis dari yang dimiliki JPA, dan spesifikasi ORMnya masih lebih maju dari fitur yang diusulkan JPA2
sumber
JDO memiliki fitur-fitur canggih daripada JPA, lihat http://db.apache.org/jdo/jdo_v_jpa.html
sumber
Saya menggunakan JPA (implementasi OpenJPA dari Apache yang didasarkan pada basis kode KODO JDO yang berusia 5+ tahun dan sangat cepat / dapat diandalkan). IMHO siapa pun yang memberitahu Anda untuk memintas spesifikasi memberikan Anda nasihat buruk. Saya menaruh waktu dan pasti dihargai. Dengan JDO atau JPA Anda dapat mengubah vendor dengan perubahan minimal (JPA memiliki pemetaan orm jadi kami berbicara kurang dari sehari untuk kemungkinan mengubah vendor). Jika Anda memiliki 100+ tabel seperti yang saya lakukan ini sangat besar. Plus Anda mendapatkan caching built0in dengan pengusiran cache cluster-wise dan semuanya baik. SQL / Jdbc baik untuk permintaan kinerja tinggi tetapi ketekunan transparan jauh lebih unggul untuk menulis algoritma dan rutinitas input data. Saya hanya memiliki sekitar 16 query SQL di seluruh sistem saya (50k + baris kode).
sumber
Saya sudah melihat ini sendiri dan tidak dapat menemukan perbedaan yang kuat antara keduanya. Saya pikir pilihan besar adalah implementasi yang Anda gunakan. Untuk saya sendiri, saya telah mempertimbangkan platform DataNucleus karena merupakan implementasi agnostik data-store dari keduanya.
sumber
Siapa pun yang mengatakan bahwa JDO sudah mati adalah penjual FUD astroturfing dan mereka tahu itu.
JDO hidup dan sehat. Spesifikasi ini masih lebih kuat, lebih matang dan lebih maju daripada JPA yang jauh lebih muda dan terbatas.
Jika Anda ingin membatasi diri hanya pada apa yang tersedia dalam standar JPA, Anda dapat menulis ke JPA dan menggunakan DataNucleus sebagai implementasi persistensi yang berkinerja tinggi dan lebih transparan daripada implementasi JPA lainnya. Tentu saja DataNucleus juga mengimplementasikan standar JDO jika Anda menginginkan fleksibilitas dan efisiensi pemodelan yang dibawa JDO.
sumber
Saya telah menggunakan Hibernate (implementasi JPA) dan JPOX (implementasi JDO) dalam proyek yang sama. JPOX bekerja dengan baik, tetapi bertemu dengan bug dengan cukup cepat, di sana ada beberapa fitur Java 5 bahasa yang tidak didukung pada saat itu. Itu memiliki masalah bermain baik dengan transaksi XA. Saya menghasilkan skema database dari objek JDO. Itu ingin terhubung ke database setiap kali yang menjengkelkan jika koneksi Oracle Anda tidak berfungsi.
Kami kemudian beralih ke Hibernate. Kami bermain-main dengan hanya menggunakan JPA murni untuk sementara, tapi kami perlu menggunakan beberapa fitur khusus Hibernate untuk melakukan pemetaan. Menjalankan kode yang sama pada banyak basis data sangat mudah. Hibernate tampaknya men-cache objek secara agresif atau hanya memiliki perilaku caching yang aneh di kali. Ada beberapa konstruksi DDL yang tidak dapat ditangani Hibernate dan mereka didefinisikan dalam file tambahan yang dijalankan untuk menginisialisasi database. Ketika saya mengalami masalah Hibernate, sering ada banyak orang yang mengalami masalah yang sama yang membuat googling untuk solusi lebih mudah. Akhirnya, Hibernate tampaknya dirancang dengan baik dan dapat diandalkan.
Beberapa responden lain menyarankan hanya menggunakan SQL. Kasus penggunaan pembunuh nyata untuk pemetaan relasional objek adalah pengujian dan pengembangan. Basis data yang dibangun untuk menangani volume data yang besar biasanya mahal dan atau mereka sulit dipasang. Mereka sulit untuk diuji. Ada banyak basis data Java dalam memori yang dapat digunakan untuk mengujinya, tetapi biasanya tidak berguna untuk produksi. Mampu menggunakan database nyata, tetapi terbatas, akan meningkatkan produktivitas pengembangan dan keandalan kode.
sumber
Saya membuat sampel WebApp pada Mei 2012 yang menggunakan JDO 3.0 & DataNucleus 3.0 - lihat betapa bersihnya: https://github.com/TorbenVesterager/BadAssWebApp
Oke mungkin itu agak terlalu bersih, karena saya menggunakan POJO baik untuk database dan klien JSON, tapi itu menyenangkan :)
PS: Berisi beberapa anotasi SuppressWarnings (dikembangkan di IntelliJ 11)
sumber