ORM Java apa yang Anda sukai, dan mengapa? [Tutup]

262

Itu pertanyaan berakhir yang cukup terbuka. Saya akan memulai proyek baru dan sedang melihat berbagai ORM untuk diintegrasikan dengan akses basis data.

Apakah Anda punya favorit? Apakah ada yang akan Anda sarankan untuk menjauh?

Tom Neyland
sumber
Lihatlah mikro-orms - pembungkus tipis di sekitar teknologi akses DB platform - seperti sql2o untuk Java github.com/aaberg/sql2o atau ServiceStack.OrmLite untuk .NET github.com/ServiceStack/ServiceStack.OrmLite
tomaszkubacki
3
Setelah menggunakan ORM selama lebih dari 5 tahun pilihan pribadi saya adalah Spring JDBC lebih dari ORM, dan terbaik kedua adalah iBatis (MyBatis), saya tidak suka berhibernasi karena kurva belajar, kurang kontrol dan masalah kinerja.
Berikut ini (juga tertutup) daftar pembungkus jdbc ringan yang dapat digunakan sebagai alternatif untuk orms full-blown: stackoverflow.com/questions/7137929/…
Vadzim

Jawaban:

237

Saya sudah berhenti menggunakan ORM.

Alasannya bukan kesalahan besar dalam konsep. Hibernate berfungsi dengan baik. Sebagai gantinya, saya telah menemukan bahwa query memiliki overhead yang rendah dan saya dapat memasukkan banyak logika kompleks ke dalam query SQL yang besar, dan menggeser banyak pemrosesan saya ke dalam database.

Jadi pertimbangkan untuk hanya menggunakan paket JDBC.

David Crawshaw
sumber
81
Ini adalah cerita yang sama berulang-ulang dengan ORM: pengembangan awal cepat yang bagus, dan pengurasan besar pada sumber daya Anda lebih lanjut dalam proyek saat melacak bug dan ketidakefisienan ORM terkait. Saya juga benci kenyataan bahwa hal itu tampaknya memberi para pengembang gagasan bahwa mereka tidak pernah harus menulis kueri yang dioptimalkan khusus.
Eelco
7
Hei, apakah ini semua benar untuk proyek kehidupan nyata yang besar?
santiagobasulto
30
Saya setuju. Saya telah menggunakan ORM lebih dari 3 tahun sekarang, dan saya tidak tahu berapa banyak waktu yang terbuang (masih) untuk menyelesaikan masalah terkait kegigihan. Kami tidak memiliki kendali apa pun tentang apa yang terjadi "di bawah tenda", konfigurasi terlalu banyak untuk dikelola secara efisien dan ada perilaku yang bisa membuat orang gila. Di sisi lain saya memiliki dukungan untuk database utama dan tidak perlu khawatir tentang perbedaan mereka.
marcolopes
58
mengapa tidak menggunakan keduanya, tergantung pada kompleksitas permintaan / transaksi? tidak seperti mereka saling eksklusif.
amfibi
6
@ WillSheppard ya Akan. Saya menggunakan Django ORM cukup banyak dan ini bekerja dengan baik. Saya pikir perbedaannya mungkin dalam sifat dinamis python (dan perl). Menggunakan ORM di Jawa itu menyakitkan. Tetapi dalam bahasa dinamis itu bisa sangat ekspresif. Ada beberapa proyek hebat untuk menanamkan operasi ORM seperti DSL di Python dan sangat bagus.
santiagobasulto
97

Tidak ada, karena memiliki ORM mengambil terlalu banyak kendali dengan manfaat kecil. Penghematan waktu yang diperoleh dengan mudah terhapus ketika Anda harus men-debug kelainan yang dihasilkan dari penggunaan ORM. Selain itu, ORM tidak mendorong pengembang untuk belajar SQL dan bagaimana database relasional bekerja dan menggunakannya untuk keuntungan mereka.

simon
sumber
4
Saya setuju dengan pernyataan ini. Berapa banyak dari total waktu pengembangan yang akan dikonsumsi dengan menulis kode kegigihan? Saya pikir kurang dari 10-15%
adrian.tarau
16
Tergantung. Tentu, jika Anda hanya menggunakan satu jenis basis data tertentu, mudah untuk tidak menggunakan ORM. Namun, ketika Anda perlu mendukung jenis database lain, ini dapat dengan cepat menjadi kurang terkelola.
Jason Baker
3
"Penghematan waktu yang didapat dengan mudah terhapus ketika Anda harus men-debug kelainan yang dihasilkan dari penggunaan ORM" Ini tidak benar ketika kurva keterampilan merupakan faktor yang layak ketika mengambil pilihan teknologi.
elsadek
7
Argumen Anda dapat ditawarkan terhadap penggunaan perpustakaan apa pun. Keuntungan terbesar ORM adalah hal-hal seperti unit kerja, pemetaan objek, pelacakan perubahan, pemuatan malas, migrasi, dan hubungan. Merupakan hal yang luar biasa untuk dapat menulis user.profile.givenName dan tidak peduli struktur apa yang digunakan untuk menyimpan data untuk itu.
Alex
1
Ini dapat digunakan terhadap perpustakaan apa pun, tetapi pada tingkat yang berbeda-beda. Secara umum saya adalah penganjur yang hebat dalam menggunakan perpustakaan - mengapa menciptakan kembali roda? Namun, dalam hal ini saya merasa bahwa Hibernate adalah untuk sebagian besar menggunakan terlalu berat dan ORM yang lebih ringan akan lebih disukai. Pengalaman saya didasarkan pada beberapa tahun pengalaman mengembangkan dengan Hibernate dan mempelajari seluk beluknya secara menyeluruh.
simon
92

Banyak ORM yang hebat, Anda perlu tahu mengapa Anda ingin menambahkan abstraksi di atas JDBC. Saya dapat merekomendasikan http://www.jooq.org kepada Anda (penafian: Saya pencipta jOOQ, jadi jawaban ini bias). JOOQ mencakup paradigma berikut:

  • SQL adalah hal yang baik. Banyak hal yang dapat diekspresikan dengan cukup baik dalam SQL. Tidak perlu abstraksi lengkap dari SQL.
  • Model data relasional adalah hal yang baik. Ini telah membuktikan model data terbaik selama 40 tahun terakhir. Tidak perlu untuk database XML atau model data yang benar-benar berorientasi objek. Sebagai gantinya, perusahaan Anda menjalankan beberapa contoh Oracle, MySQL, MSSQL, DB2 atau RDBMS lainnya.
  • SQL memiliki struktur dan sintaksis. Seharusnya tidak diekspresikan dengan menggunakan rangkaian string "level rendah" di JDBC - atau rangkaian string "tingkat tinggi" di HQL - keduanya rentan terhadap kesalahan sintaks.
  • Pengikatan variabel cenderung sangat kompleks ketika berhadapan dengan pertanyaan utama. ITULAH sesuatu yang harus diabstraksikan.
  • POJO sangat bagus ketika menulis kode Java memanipulasi data database.
  • POJO adalah rasa sakit untuk menulis dan memelihara secara manual. Pembuatan kode adalah caranya. Anda akan memiliki permintaan kompilasi-aman termasuk keamanan tipe data.
  • Basis datanya didahulukan. Meskipun aplikasi di atas basis data Anda dapat berubah seiring waktu, basis data itu sendiri mungkin akan bertahan lebih lama.
  • Ya, Anda memiliki prosedur tersimpan dan tipe yang ditentukan pengguna (UDT) di basis data lawas Anda. Alat basis data Anda harus mendukungnya.

Ada banyak ORM bagus lainnya. Terutama Hibernate atau iBATIS memiliki komunitas yang hebat. Tetapi jika Anda sedang mencari yang intuitif, sederhana, saya akan mengatakan mencoba JOOQ. Kamu akan menyukainya! :-)

Lihat contoh ini SQL:

  // Select authors with books that are sold out
  SELECT * 
    FROM T_AUTHOR a
   WHERE EXISTS (SELECT 1
                   FROM T_BOOK
                  WHERE T_BOOK.STATUS = 'SOLD OUT'
                    AND T_BOOK.AUTHOR_ID = a.ID);

Dan bagaimana hal itu bisa diungkapkan dalam jOOQ:

  // Alias the author table
  TAuthor a = T_AUTHOR.as("a");

  // Use the aliased table in the select statement
  create.selectFrom(a)
        .whereExists(create.selectOne()
                           .from(T_BOOK)
                           .where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
                           .and(T_BOOK.AUTHOR_ID.equal(a.ID))))));
Lukas Eder
sumber
1
Alat ORM sama bagusnya dengan Anda berhasil menggunakannya dengan benar. Ada proyek-proyek di mana alat-alat ORM bekerja seperti jimat, sementara di yang lain, mereka tidak cocok sama sekali. Pada akhirnya, tim pengembangan bertanggung jawab untuk memilih alat yang tepat untuk kebutuhan proyek mereka. Alat ORM sangat kompleks. Sayangnya, hanya sebagian dari semua pengembang yang akan menghabiskan waktu untuk memahami cara kerjanya. Sisanya hanya akan menyalahkan alat dan mengatakan itu buruk. Pertanyaannya adalah: Apakah jawaban yang paling banyak dipilih menawarkan saran terbaik? > Jadi pertimbangkan untuk hanya menggunakan paket JDBC. Apakah kita benar-benar ingin menggunakan JDBC biasa?
Vlad Mihalcea
Saya mencoba untuk tidak membiarkan "Basis data lebih dulu.". Aplikasi berisi aturan bisnis untuk fitur yang diminta klien dan mereka hampir tidak pernah meminta untuk membuat database. Itu detail teknis yang ditentukan selama implementasi.
Kwebble
58

Hibernate, karena pada dasarnya standar de facto di Jawa dan merupakan salah satu kekuatan pendorong dalam penciptaan JPA. Itu mendapat dukungan yang sangat baik di Spring, dan hampir setiap kerangka kerja Java mendukungnya. Akhirnya, GORM adalah pembungkus yang sangat keren di sekitarnya melakukan pencari dinamis dan sebagainya menggunakan Groovy.

Itu bahkan telah porting ke .NET (NHibernate) sehingga Anda dapat menggunakannya di sana juga.

Abdullah Jibaly
sumber
4
Saya memilih Hib juga, tetapi dengan tambahan penting: kita harus menggunakan API JPA hanya bahkan jika implementasi JPA sebenarnya disediakan oleh Hib.
Vladimir Dyuzhev
52

Hibernate, karena:

  • stabil - berada di sekitar selama bertahun-tahun, tidak memiliki masalah besar
  • menentukan standar di bidang ORM
  • mengimplementasikan standar (JPA), selain mendikte itu.
  • memiliki banyak informasi tentang itu di Internet. Ada banyak tutorial, solusi masalah umum, dll
  • kuat - Anda dapat menerjemahkan model objek yang sangat kompleks menjadi model relasional.
  • ia memiliki dukungan untuk RDBMS utama dan menengah
  • mudah digunakan, setelah Anda mempelajarinya dengan baik

Beberapa poin mengapa (dan kapan) menggunakan ORM:

  • Anda bekerja dengan objek di sistem Anda (jika sistem Anda telah dirancang dengan baik). Bahkan jika menggunakan JDBC, Anda akhirnya akan membuat beberapa layer terjemahan, sehingga Anda mentransfer data Anda ke objek Anda. Tapi taruhan saya adalah hibernate lebih baik dalam terjemahan daripada solusi custom-made.
  • itu tidak membuat Anda kehilangan kendali. Anda dapat mengontrol berbagai hal dalam detail yang sangat kecil, dan jika API tidak memiliki beberapa fitur jarak jauh - jalankan kueri asli dan Anda memilikinya.
  • sistem menengah atau lebih besar mana pun tidak mampu memiliki satu ton permintaan (baik itu di satu tempat atau tersebar di seluruh), jika itu bertujuan untuk dipertahankan
  • jika kinerja tidak kritis. Hibernate menambahkan overhead kinerja, yang dalam beberapa kasus tidak dapat diabaikan.
Bozho
sumber
Ketika saya membandingkan Hibernate dan JPA saya memilih Hibernate, dan jika membandingkan JPA dan JDO saya menggunakan JDO! Saya sangat suka JDO, tapi saya suka dua fitur Hibernate (yang tidak tersedia di JDO), satu adalah @Filters dan yang lainnya adalah Anda dapat memetakan bidang versi (untuk penguncian optimis) ke bidang normal, yang tidak mungkin di JDO .
Amir Pashazadeh
27

Saya akan merekomendasikan menggunakan MyBatis . Ini adalah lapisan tipis di atas JDBC, sangat mudah untuk memetakan objek ke tabel dan masih menggunakan SQL biasa, semuanya ada di bawah kendali Anda.

adrian.tarau
sumber
10
Ibatis untuk bacaan kompleks, dan hibernasi untuk buat, perbarui hapus, dan bacaan sederhana adalah pilihan yang sempurna.
darpet
19

Saya memiliki pengalaman yang sangat bagus dengan Avaje Ebean ketika saya sedang menulis aplikasi JavaSE berukuran sedang.

Ia menggunakan anotasi JPA standar untuk mendefinisikan entitas, tetapi memperlihatkan API yang jauh lebih sederhana (Tidak Ada EntityManager atau semua yang terlampir / terpisah entitas omong kosong). Ini juga memungkinkan Anda dengan mudah menggunakan kueri SQL atau memanggil panggilan JDBC saat diperlukan.

Ini juga memiliki API cairan dan tipe-aman yang sangat bagus untuk kueri. Anda dapat menulis hal-hal seperti:

List<Person> boys = Ebean.find(Person.class)
                                  .where()
                                       .eq("gender", "M")
                                       .le("age", 18)
                                  .orderBy("firstName")
                                  .findList();
IgKh
sumber
6
Saya harus sedikit aneh ... pilih dari Orang mana jenis kelamin = 'M' dan usia <18 dipesan oleh firstName hanya terlihat jauh lebih baik bagi saya :-)
Eelco
4
Ini adalah salah satu dari orms terbaik yang pernah saya lihat di java Keputusan untuk menggunakan singleton menyegarkan dan memberikan keuntungan praktis yang besar dibandingkan yang lain.
opsb
Saya pikir maksud Anda lancar bukan cairan.
Montdidier
@opsb Saya pikir secara teknis itu monostate, bukan singleton.
Montdidier
Bagaimana cara Memulai dengan Avaje Ebean ORM? Ada Video Tutorial ??
Avinash
11

SimpleORM , karena lurus dan tanpa sihir. Ini mendefinisikan semua struktur data meta dalam kode Java dan sangat fleksibel.

SimpleORM menyediakan fungsionalitas yang mirip dengan Hibernate dengan memetakan data dalam database relasional ke objek Java dalam memori. Kueri dapat ditentukan dalam hal objek Java, identitas objek disejajarkan dengan kunci basis data, hubungan antara objek dipertahankan dan objek yang dimodifikasi secara otomatis memerah ke database dengan kunci optimis.

Tetapi tidak seperti Hibernate, SimpleORM menggunakan struktur objek dan arsitektur yang sangat sederhana yang menghindari perlunya penguraian kompleks, pemrosesan kode byte, dll. SimpleORM kecil dan transparan, dikemas dalam dua botol dengan ukuran hanya 79K dan 52K, dengan hanya satu kecil dan opsional ketergantungan (Slf4j). (Hibernate lebih dari 2400K plus sekitar 2000K Jars dependen.) Ini membuat SimpleORM mudah dipahami dan sangat mengurangi risiko teknis.

David Schmitt
sumber
Belum menggunakannya, tetapi ActiveObjects menggambarkan dirinya sebagai semacam Hibernate-lite di situs web mereka, jadi mungkin ada beberapa kesamaan.
Abdullah Jibaly
10

Eclipse Link , untuk banyak alasan, tetapi terutama saya merasa seperti itu memiliki lebih sedikit mengasapi daripada solusi aliran utama lainnya (setidaknya lebih sedikit di-wajah Anda mengasapi).

Oh dan Eclipse Link telah dipilih untuk menjadi implementasi referensi untuk JPA 2.0

Tom Neyland
sumber
5

Sementara saya berbagi keprihatinan tentang penggantian Java untuk query SQL bentuk-bebas, saya benar-benar berpikir orang mengkritik ORM melakukannya karena desain aplikasi yang umumnya buruk.

OOD sejati didorong oleh kelas dan hubungan, dan ORM memberi Anda pemetaan yang konsisten dari berbagai jenis dan objek hubungan. Jika Anda menggunakan alat ORM dan mengakhiri pengkodean ekspresi kueri dalam bahasa apa pun yang didukung kerangka kerja ORM (termasuk, tetapi tidak terbatas pada pohon ekspresi Java, metode kueri, OQL dll.), Anda pasti melakukan sesuatu yang salah, yaitu model kelas Anda kemungkinan besar tidak mendukung persyaratan Anda seperti seharusnya. Desain aplikasi yang bersih tidak benar-benar membutuhkan pertanyaan pada level aplikasi. Saya telah refactoring banyak proyek orang mulai menggunakan kerangka kerja ORM dengan cara yang sama seperti mereka digunakan untuk menanamkan konstanta string SQL dalam kode mereka, dan pada akhirnya semua orang terkejut tentang betapa sederhananya dan terpeliharanya seluruh aplikasi setelah Anda mencocokkan tingkatkan model kelas Anda dengan model penggunaan. Memang, untuk hal-hal seperti fungsi pencarian dll. Anda memerlukan bahasa permintaan, tetapi meskipun begitu permintaan sangat dibatasi sehingga membuat VIEW dan pemetaan yang bahkan kompleks sehingga untuk kelas persisten baca-saja jauh lebih baik untuk dipertahankan dan dilihat daripada membangun ekspresi dalam beberapa bahasa permintaan dalam kode aplikasi Anda. Pendekatan VIEW juga memanfaatkan kemampuan basis data dan, melalui materialisasi, bisa jauh lebih baik dari segi kinerja daripada SQL yang ditulis tangan di sumber Java Anda. Jadi, saya tidak melihat alasan untuk aplikasi non-sepele TIDAK untuk menggunakan ORM. tetapi meskipun begitu pertanyaan sangat dibatasi sehingga membuat VIEW dan pemetaan yang lebih kompleks yang hanya untuk kelas persisten baca-jauh lebih baik untuk dipelihara dan dilihat daripada membangun ekspresi dalam beberapa bahasa permintaan dalam kode aplikasi Anda. Pendekatan VIEW juga memanfaatkan kemampuan basis data dan, melalui materialisasi, bisa jauh lebih baik dari segi kinerja daripada SQL yang ditulis tangan di sumber Java Anda. Jadi, saya tidak melihat alasan untuk aplikasi non-sepele TIDAK untuk menggunakan ORM. tetapi meskipun begitu pertanyaan sangat dibatasi sehingga membuat VIEW dan pemetaan yang lebih kompleks yang hanya untuk kelas persisten baca-jauh lebih baik untuk dipelihara dan dilihat daripada membangun ekspresi dalam beberapa bahasa permintaan dalam kode aplikasi Anda. Pendekatan VIEW juga memanfaatkan kemampuan basis data dan, melalui materialisasi, bisa jauh lebih baik dari segi kinerja daripada SQL yang ditulis tangan di sumber Java Anda. Jadi, saya tidak melihat alasan untuk aplikasi non-sepele TIDAK untuk menggunakan ORM.

Mirko Klemm
sumber
11
Jika Anda membangun aplikasi di atas toko persisten, seperti yang banyak dari kita lakukan, apakah itu RDBMS atau rasa NoSQL, toko itu akan memiliki cara efisien untuk mengaksesnya. Mencoba untuk abstrak dari itu terlalu banyak hanyalah rekayasa berlebihan. Menjadi terlalu bersemangat tentang 'OOD sejati' membuat arsitektur astronot Jawa terkenal itu.
Eelco