Apa yang akan Anda pikirkan tentang alat kegigihan Java baru, itu sebenarnya bukan ORM? [Tutup]

12

Ketekunan di Jawa

Selama beberapa tahun terakhir, saya telah mengumpulkan pengalaman di bidang abstraksi kegigihan di Jawa, menggunakan konsep seperti EJB 2.0, Hibernate, JPA, dan yang dikembangkan sendiri. Bagi saya, mereka memiliki kurva belajar yang curam dan banyak kerumitan. Selain itu, sebagai penggemar berat SQL, saya juga berpikir bahwa banyak model abstraksi memberikan terlalu banyak abstraksi atas SQL, menciptakan konsep seperti "kriteria", "predikat", "pembatasan" yang merupakan konsep yang sangat bagus, tetapi bukan SQL.

Gagasan umum abstraksi kegigihan di Jawa tampaknya didasarkan pada model Object-relational, di mana RDBMS entah bagaimana cocok dengan dunia OO. Perdebatan ORM selalu menjadi sesuatu yang emosional, karena tampaknya tidak ada solusi tunggal yang cocok untuk semua orang - jika solusi semacam itu bahkan bisa ada.

JOOQ

Preferensi pribadi saya tentang cara menghindari masalah terkait ORM adalah tetap berpegang pada dunia relasional. Sekarang pilihan paradigma model data tidak boleh menjadi topik diskusi karena merupakan preferensi pribadi, atau masalah model data apa yang paling cocok dengan masalah nyata. Diskusi yang ingin saya mulai adalah tentang alat kegigihan saya sendiri yang disebut jOOQ . Saya merancang jOOQ untuk memberikan sebagian besar kelebihan yang dimiliki alat-alat kegigihan modern:

  • Bahasa Spesifik Domain berdasarkan SQL
  • Pembuatan kode sumber memetakan skema database yang mendasarinya ke Jawa
  • Dukungan untuk banyak RDBMS

Menambahkan beberapa fitur yang dimiliki beberapa alat kegigihan modern (koreksi saya jika saya salah):

  • Dukungan untuk SQL kompleks - serikat pekerja, seleksi bersarang, self-joins, aliasing, klausa kasus, ekspresi aritmatika
  • Dukungan untuk SQL non-standar - prosedur tersimpan, UDT, ENUMS, fungsi asli, fungsi analitik

Silakan pertimbangkan halaman dokumentasi untuk lebih jelasnya: http://www.jooq.org/learn.php . Anda akan melihat bahwa pendekatan yang sangat mirip diimplementasikan dalam Linq untuk C #, meskipun Linq tidak secara khusus dirancang untuk SQL.

Pertanyaan

Sekarang, setelah mengatakan bahwa saya penggemar berat SQL, saya bertanya-tanya apakah pengembang lain akan berbagi antusiasme saya untuk jOOQ (atau Linq). Apakah jenis pendekatan untuk abstraksi kegigihan ini layak dilakukan? Apa kelebihan / kekurangan yang mungkin Anda lihat? Bagaimana saya bisa meningkatkan jOOQ, dan apa yang hilang menurut Anda? Di mana saya salah, secara konsep atau praktis?

Jawaban kritis tetapi konstruktif dihargai

Saya mengerti bahwa debat ini bersifat emosional. Ada banyak alat hebat di luar sana yang sudah melakukan hal serupa. Yang saya minati adalah umpan balik yang penting tetapi konstruktif, berdasarkan pengalaman Anda sendiri atau artikel yang mungkin telah Anda baca.

Lukas Eder
sumber
Apakah ini menangani transaksi?
Armand
@Alison: Tidak, ini hanya tentang SQL. Penanganan transaksi adalah bisnis yang sangat kompleks yang saya pikir banyak alat / kerangka kerja lain (termasuk EJB2 / 3) akan menangani lebih baik daripada jOOQ
Lukas Eder
Saya akan sangat menyarankan kasus penggunaan yang sangat solid dan bertenaga di mana Anda menunjukkan pendekatan Anda menjadi sangat baik untuk menyelesaikannya.
Juga perhatikan bahwa mengedit INI berat akan membuat jawaban lebih atau kurang relevan dan karenanya tidak dapat digunakan untuk pembaca masa depan. Ajukan pertanyaan baru, dan lebih baik, sebagai gantinya.
Hai, Thorbjorn. Maksud Anda use case selain dari yang ditunjukkan pada halaman contoh? Atau Anda ingin melihat beberapa contoh dalam pertanyaan itu sendiri? Tentang hasil edit: Anda benar secara umum. Namun dalam hal ini, saya pikir dua jawaban yang saya dapatkan sejauh ini akan sama ...
Lukas Eder

Jawaban:

5

Saya pikir Anda berada di jalur yang benar dan harus melanjutkan solusi Anda. Beberapa kritik sebelumnya terlalu keras, tetapi beberapa poin valid dibuat.

Saya juga sudah lama mencari solusi ORM berfitur lengkap yang sesuai dengan kebutuhan saya, tetapi setiap solusi yang saya lihat kurang. Masing-masing memiliki pro dan kontra tetapi tidak ada yang benar-benar melakukan semua yang saya inginkan. Saya setuju dengan kritik Anda terhadap solusi ini - yaitu bahwa mereka umumnya kompleks dan memiliki kurva belajar yang curam.

Pesaing teratas harus menjadi standar de facto, Hibernate. Ini fitur lengkap, kuat dan teruji. Saya menghargainya dan menghargainya apa adanya. Sekarang, dengan risiko menyinggung setengah komunitas pemrograman, saya juga harus mengatakan bahwa itu adalah kode non-performant yang membengkak dan kompleks. Saya telah menghabiskan cukup banyak waktu mencari-cari di ususnya, mencoba men-debug dan memahaminya, dan saya tidak terkesan dengan apa yang saya lihat. Karena itu, saya masih akan merekomendasikannya sebagai titik awal bagi siapa pun yang mencari ORM yang baik. Itu unggul di CRUD sederhana, tapi saya tidak akan menggunakannya untuk permintaan massal pemain, seperti data mining atau angka-angka.

Sayangnya, aplikasi saya lebih banyak variasi angka (meskipun ada beberapa CRUD juga), jadi saya memutuskan untuk roll sendiri. Saya tahu sejak awal bahwa itu akan setara dengan solusi lain di luar sana, tetapi itu akan cukup baik dan memberi saya kinerja yang saya butuhkan. Sekarang inilah bagian yang sangat hebat: ini sangat mirip dengan solusi Anda!

Inilah yang menurut saya paling benar Anda lakukan: Anda menyatakan keyakinan mendasar Anda sebagai semacam pernyataan misi, dan keyakinan itu benar. Saya jelas telah menghabiskan cukup banyak waktu untuk memikirkan masalah ini juga, dan ini adalah masalah yang sulit untuk dipecahkan. Tetapi seiring berjalannya waktu, saya pikir komunitas pemrograman datang untuk memahaminya dengan lebih baik, dan kami akan menciptakan solusi yang lebih baik. Kudos untuk semua upaya sebelumnya (terutama Hibernate), tapi saya pikir kita bisa melakukan yang lebih baik.

Solusi Anda lebih baik memperbaiki masalah, tetapi hanya memecahkan sebagian saja. Saya pikir pendekatan berlapis dapat memberi kita semua yang kita inginkan. Apa yang Anda hasilkan / IMO, adalah layer fondasi. Seperti yang Anda sarankan, saya pikir lapisan ini paling baik dibuat secara otomatis berdasarkan skema database. Ini harus menjadi model objek relasional yang sangat sederhana yang memetakan langsung ke database dan tidak lebih. Anda benar bahwa data bertahan lebih lama daripada kode, jadi pada level ini, data harus mengarahkan kode dan bukan sebaliknya. Ini akan mendukung CRUD serta permintaan massal yang dilakukan. Saya mungkin akan menerapkan beberapa jenis L1 cache pada layer ini.

Namun, hal yang menjadi keunggulan solusi ORM lainnya adalah kemampuan untuk mendefinisikan objek Anda dengan cara yang tidak terlalu bergantung pada struktur aktual dari basis data yang mendasarinya. Untuk fungsi ini, saya akan membuat layer lain. Dengan kebutuhan lapisan ini menjadi lebih abstrak, semoga lebih sederhana (dengan mengorbankan fungsionalitas yang hilang), dan dibangun di atas lapisan sebelumnya. Mungkin menggunakan cache L2.

Saya terbuka untuk memiliki lebih banyak lapisan, tetapi poin utama bagi saya adalah dengan menyediakan beberapa titik masuk ke perpustakaan, Anda dapat memenuhi setiap kebutuhan. Bagi mereka yang menginginkan solusi CRUD sederhana yang memetakan langsung ke objek yang mereka pilih, mereka dapat membangun di atas lapisan. Bagi mereka yang mencari sesuatu yang lebih kuat dan berkinerja tetapi bersedia untuk menambah kerumitan, mereka bisa pasang ke lapisan bawah. Saya tidak akan membuat bahasa permintaan khusus, tetapi sebaliknya akan mengekspos objek pembuat kueri Anda untuk tujuan ini. Dan karena kode berlapis, fungsi itu secara alami ada tanpa pass-through khusus.

Saya pikir Anda memiliki pemahaman tentang ruang dan tidak menciptakan kembali roda tetapi telah mencapai ceruk yang sedikit berbeda. Dan sejujurnya, ini adalah roda yang bisa menggunakan peningkatan. Anda menghadapi perjuangan berat melawan kekuatan di masa lalu, tetapi jika solusi Anda baik, dan saya pikir itu menuju ke arah itu, maka itu akan mendapatkan popularitas berdasarkan kemampuannya sendiri.

Dale Anderson
sumber
Hai Dale, terima kasih atas dorongan Anda! Saya suka ungkapan Anda tentang lapisan dan jOOQ berada di lapisan terendah dengan abstraksi lebih lanjut mungkin di atas jOOQ. Itu adalah sesuatu yang ingin saya atasi ketika saya memiliki momentum yang cukup dengan JOOQ. Berinteraksi dengan JPA dan / atau Hibernate jelas akan ada di peta jalan. Seperti yang Anda katakan, alat-alat ini unggul dalam kesederhanaan melalui abstraksi dan memiliki banyak fitur yang tidak saya inginkan di lapisan saya: transaksi, sesi, cache L2, dll. PS: Apakah solusi Anda sendiri dalam domain publik? Saya akan sangat tertarik!
Lukas Eder
8

"Ada banyak peluru ajaib di luar sana, dan tidak ada kekurangan pengembang yang naif."

Jangan tersinggung, tampaknya Anda tidak sepenuhnya memahami apa yang telah dilakukan di ruang ini dan karenanya menciptakan kembali beberapa roda - pengalaman akan memberi tahu kami semua bahwa roda yang Anda buat, walaupun rapi dan menyenangkan, kemungkinannya tidak akan sebesar bagus atau bermanfaat karena roda yang telah disempurnakan dengan baik sudah tersedia.

quentin-starin
sumber
1
Terima kasih atas tanggapan Anda! Apakah Anda sudah melihat perpustakaan saya lebih mendalam? Saya justru mencoba untuk "meninggalkan O" bagaimana artikel Anda menyebutnya. JOOQ ingin pengembang menulis SQL, bukan kode OR-Mapped. Saya mencoba untuk mencapai apa yang dilakukan Linq untuk .NET tanpa dapat menulis ulang kompiler Java. Selamat kepada Microsoft untuk Linq! Dan saya berani mengatakan bahwa saya tidak naif, karena saya membuat jOOQ setelah saya tidak puas dengan EJB 2.0 (beberapa waktu yang lalu), atau dengan Hibernate. Justru karena alasan yang Anda tunjukkan dalam artikel Anda. Saya mencoba apa yang telah dilakukan dan itu tidak sesuai dengan kebutuhan saya.
Lukas Eder
jOOQ ingin pengembang menggunakan API seperti Kriteria Anda. Itu bukan SQL. Ini adalah cara untuk membuat SQL yang pada kenyataannya lebih jelek dan lebih rumit daripada SQL dengan sangat sedikit, jika ada, manfaat nyata. "q.addCompareCondition (TAuthor.YEAR_OF_BIRTH, 1920, Pembanding.GREATER);" Saya melihat tidak ada yang benar-benar berbeda dari alat generasi kelas-per-tabel lainnya. Yang berarti, seperti yang saya katakan, ada kemungkinan hampir pasti bahwa yang lebih baik sudah ada. Bidang string yang dihasilkan template bahkan tidak mendekati apa yang dimungkinkan oleh ekspresi lambda.
quentin-starin
1
Agak sulit bagi saya untuk memahami motivasi di balik jawaban / komentar Anda. Saya masih berpikir bahwa Anda belum melihat dengan teliti contoh-contoh yang saya berikan (Anda mengutip contoh pertama) dan perbandingan Anda dengan produk pesaing tampaknya agak kabur bagi saya. Inti dari pertanyaan saya adalah untuk mendapatkan umpan balik yang konstruktif, dan saya akan sangat menghargai itu. Anda menyebutkan "alat yang lebih baik" dan "ekspresi lambda". Bisakah Anda jelaskan? Bagaimana jOOQ dibandingkan dengan alat yang Anda sebutkan? Bagaimana ekspresi lambda diterapkan di Java 6 - sebelum Oracle dapat menambahkannya di Java 8? Terima kasih lagi
Lukas Eder
2

Salah satu skenario yang akan membuat API semacam ini sangat cocok adalah ketika Anda membutuhkan pembangun database agnostik-database yang sebagian besar ORM tidak mengizinkannya. Satu situasi besar di mana saya membutuhkannya adalah dalam menghasilkan Laporan. Saya perlu membangun SQL dengan cara yang berorientasi objek dan akan menjalankan sql ini pada berbagai database untuk pengujian. Hibernate dan ORM lainnya sangat tergantung pada konfigurasi, sehingga membatasi konstruksi sql saya sehingga saya tidak bisa menggabungkan tabel di mana asosiasi tidak ada di xmls. Karena asosiasi apa pun dimungkinkan dalam Modul Laporan yang saya kembangkan, saya telah mencari sesuatu yang berbeda. Kemudian saya menemukan JOOQ. Itu hanya memecahkan masalah saya. Saya hanya perlu akses baca saja, tidak pernah mengalami masalah debugging yang menyakitkan seperti di hibernasi.

Saya sebenarnya berencana untuk mengembangkan cara pemodelan data yang berbeda daripada cara POJO umum dan menggunakan JOOQ sebagai salah satu fondasi yang merupakan lapisan untuk membangun SQL. Jadi di atas JOOQ, saya berencana untuk membuat cara pemodelan data / entitas yang lebih fleksibel dengan menggunakan HashMaps. Desain saya akan memungkinkan untuk mengintegrasikan desain front end dan backend lebih mudah di satu titik masuk, meskipun saya akan menggunakan berbagai lapisan untuk menyelesaikan kerangka kerja, seperti yang dikatakan komentar di atas. JOOQ benar-benar akan memainkan peran yang sangat bagus seperti dalam proyek saya sendiri, itu berfungsi sebagai salah satu fondasi atau pilar.

Jadi, teruskan kerja bagus luka!

pokok anggur
sumber
1

Jika saya memahami alat Anda dengan benar, itu memetakan Objek langsung ke kerangka kerja konseptual SQL daripada memetakan Objek yang menerapkan beberapa pemetaan ke fungsionalitas SQL (ORM), hampir seperti ORM - abstraksi untuk kontrol culun yang lebih besar sehingga Anda dapat menggunakan lebih banyak fitur SQL ORM biasanya tidak akan memberi Anda?

Tidak yakin masalah apa yang Anda coba selesaikan. Karena alat Anda membutuhkan pengetahuan mendalam tentang SQL, bukankah orang hanya akan menggunakan, yah, SQL? Apakah itu kode lem yang Anda coba singkirkan? Validasi yang lebih baik dari query SQL melalui pemodelan API daripada string sederhana?

Saya harus mengakui bahwa contoh JOOQ Anda terlihat seperti versi LISP dari SQL. Bukan berarti itu adalah hal yang buruk :) dan saya memang melihat beberapa hal maju menjadi menarik, tetapi keuntungan yang Anda daftarkan perlahan-lahan menghilang ketika Anda menjadi semakin maju (lebih konfigurasi, kurang abstrak, lebih mendarah daging di tempat suci dari SQL spesifik mesin, dll.)

Satu saran yang ingin saya lihat bahwa saya kehilangan sebagian besar ORM adalah kerangka kerja yang dapat menangani Objek dengan cara non-relasional, menerjemahkan interaksi Obyek ke dalam apa pun yang mungkin menjadi backend (SQL, NoSQL, Peta Topik, RDF, dll. .) yang membutuhkan caching Model yang digunakan daripada spesifik interaksi SQL, dialek, dan pemikiran relasional.

IMHO, tentu saja. :)

AlexanderJohannesen
sumber
Halo, terima kasih atas tanggapan Anda. Anda benar. Seperti yang dikatakan qstarin, saya mencoba menghapus "O" dari ORM dan tetap berhubungan. Mengapa tidak menggunakan SQL? Maksudmu JDBC? Apakah Anda pernah menanyakan database Anda dengan 5 pilihan tersarang dan beberapa bergabung, fungsi analitik dengan JDBC? Kesalahan sintaksis, ketidakcocokan mengikat, dll. Sayangnya, jOOQ tidak bisa menjadi alat yang tepat untuk Anda, karena tidak ada kemungkinan untuk memetakan model APAPUN ke objek. Dan saya tidak menginginkan itu. JOOQ HARUS bersifat relasional. Bagi para pengembang yang lebih memilih cara berpikir seperti itu. Untuk yang lain saya sarankan JPA .. Atau Linq jika Anda melakukan .NET
Lukas Eder