Berbicara sebagai seseorang yang menghabiskan sedikit waktu bekerja dengan JPA (Java Persistence API, pada dasarnya API ORM standar untuk Java / J2EE / EJB), yang meliputi Hibernate, EclipseLink, Toplink, OpenJPA dan lainnya, saya akan membagikan sebagian dari saya pengamatan.
- ORM tidak cepat. Mereka bisa memadai dan sebagian besar waktu memadai OK tetapi dalam lingkungan latensi rendah volume tinggi mereka tidak-tidak;
- Secara umum bahasa pemrograman tujuan seperti Java dan C # Anda memerlukan banyak sekali keajaiban untuk membuatnya bekerja (mis. Menenun waktu di Jawa, instrumentasi, dll);
- Saat menggunakan ORM, daripada melangkah lebih jauh dari SQL (yang tampaknya menjadi maksudnya), Anda akan kagum dengan berapa banyak waktu yang Anda habiskan untuk mengubah XML dan / atau anotasi / atribut untuk mendapatkan ORM Anda untuk menghasilkan performant SQL;
- Untuk pertanyaan kompleks, sebenarnya tidak ada pengganti. Seperti di JPA ada beberapa pertanyaan yang tidak mungkin ada dalam SQL mentah dan ketika Anda harus menggunakan SQL mentah di JPA itu tidak cantik (C # /. Net setidaknya memiliki tipe dinamis - var - yang banyak lebih bagus dari pada array Object);
- Ada banyak sekali "gotcha" saat menggunakan ORM. Ini termasuk perilaku yang tidak disengaja atau tidak terduga, fakta bahwa Anda harus membangun kemampuan untuk melakukan pembaruan SQL ke database Anda (dengan menggunakan refresh () di JPA atau metode serupa karena JPA secara default cache semuanya sehingga tidak akan menangkap database langsung pembaruan - menjalankan pembaruan SQL langsung adalah aktivitas dukungan produksi yang umum);
- Ketidakcocokan objek-relasional selalu akan menyebabkan masalah. Dengan masalah semacam itu ada pertukaran antara kompleksitas dan kelengkapan abstraksi. Kadang-kadang saya merasa JPA melangkah terlalu jauh dan mencapai hukum pengembalian yang semakin berkurang di mana kompleksitasnya tidak dibenarkan oleh abstraksi.
Ada masalah lain yang membutuhkan sedikit penjelasan.
Model tradisional untuk aplikasi Web adalah memiliki lapisan ketekunan dan lapisan presentasi (mungkin dengan layanan atau lapisan lain di antaranya tetapi ini adalah dua yang penting untuk diskusi ini). ORM memaksakan pandangan kaku dari lapisan kegigihan Anda ke lapisan presentasi (yaitu entitas Anda).
Salah satu kritik dari metode SQL yang lebih baku adalah bahwa Anda berakhir dengan semua VO (objek bernilai) atau DTO (objek transfer data) yang digunakan hanya dengan satu kueri. Ini disebut-sebut sebagai keuntungan ORM karena Anda menyingkirkan itu.
Masalahnya adalah masalah tidak hilang dengan ORM, mereka hanya naik ke lapisan presentasi. Alih-alih membuat VOs / DTO untuk kueri, Anda membuat objek presentasi khusus, biasanya satu untuk setiap tampilan. Bagaimana ini lebih baik? IMHO tidak.
Saya sudah menulis tentang ini dalam ORM atau SQL: Apakah kita sudah sampai? .
Teknologi ketekunan pilihan saya (di Jawa) hari ini adalah ibatis. Ini adalah pembungkus yang sangat tipis di sekitar SQL yang melakukan 90% + dari apa yang dapat dilakukan JPA (bahkan dapat melakukan pemuatan hubungan yang malas meskipun tidak terdokumentasi dengan baik) tetapi dengan overhead yang jauh lebih sedikit (dalam hal kompleksitas dan kode aktual).
Ini muncul tahun lalu di aplikasi GWT yang saya tulis. Banyak terjemahan dari EclipseLink ke objek presentasi dalam implementasi layanan. Jika kita menggunakan ibatis, akan jauh lebih mudah untuk membuat objek yang sesuai dengan ibatis dan meneruskannya ke atas dan ke bawah tumpukan. Beberapa puritan mungkin berpendapat ini adalah Bad ™. Mungkin begitu (dalam teori) tapi saya katakan: apa itu akan menyebabkan kode lebih sederhana, tumpukan lebih sederhana dan lebih banyak produktivitas.