यह एक बहुत खुला सवाल है। मैं एक नई परियोजना शुरू करूंगा और डेटाबेस एक्सेस के साथ एकीकृत करने के लिए विभिन्न ओआरएम देख रहा हूं।
क्या आपका कोई पसंदीदा है? क्या कोई ऐसा है जिसके बारे में आप स्पष्ट रहने की सलाह देंगे?
यह एक बहुत खुला सवाल है। मैं एक नई परियोजना शुरू करूंगा और डेटाबेस एक्सेस के साथ एकीकृत करने के लिए विभिन्न ओआरएम देख रहा हूं।
क्या आपका कोई पसंदीदा है? क्या कोई ऐसा है जिसके बारे में आप स्पष्ट रहने की सलाह देंगे?
जवाबों:
मैंने ORM का उपयोग करना बंद कर दिया है।
इसका कारण अवधारणा में कोई बड़ा दोष नहीं है। हाइबरनेट अच्छी तरह से काम करता है। इसके बजाय, मैंने पाया है कि प्रश्नों में कम ओवरहेड है और मैं बहुत सारे जटिल तर्क को बड़े SQL प्रश्नों में फिट कर सकता हूं, और डेटाबेस में अपनी बहुत सी प्रसंस्करण को स्थानांतरित कर सकता हूं।
तो सिर्फ JDBC पैकेज का उपयोग करने पर विचार करें।
कोई नहीं, क्योंकि ORM होने से छोटे लाभों के साथ बहुत अधिक नियंत्रण हो जाता है। प्राप्त की गई समय की बचत को आसानी से उड़ा दिया जाता है, जब आपको ओआरएम के उपयोग से उत्पन्न असामान्यताओं को डीबग करना पड़ता है। इसके अलावा, ORMs SQL सीखने से डेवलपर्स को हतोत्साहित करते हैं और कैसे रिलेशनल डेटाबेस काम करते हैं और अपने लाभ के लिए इसका उपयोग करते हैं।
कई ओआरएम महान हैं, आपको यह जानना होगा कि आप जेडीबीसी के शीर्ष पर अमूर्तता क्यों जोड़ना चाहते हैं। मैं आपको http://www.jooq.org सलाह दे सकता हूं (अस्वीकरण: मैं jOOQ का निर्माता हूं, इसलिए यह उत्तर पक्षपाती है)। jOOQ निम्नलिखित प्रतिमान को गले लगाता है:
कई अन्य अच्छे ओआरएम हैं। विशेष रूप से हाइबरनेट या आईबैटिस में एक महान समुदाय है। लेकिन अगर आप एक सहज, सरल की तलाश में हैं, तो मैं कहूंगा कि jOOQ को आज़माएं। आपको बहुत पसंद आएगा! :-)
इस उदाहरण की जाँच करें 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);
और इसे 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))))));
हाइबरनेट करें, क्योंकि यह मूल रूप से जावा में डिफैक्टो मानक है और जेपीए के निर्माण में ड्राइविंग बलों में से एक था। इसे स्प्रिंग में उत्कृष्ट समर्थन मिला है, और लगभग हर जावा फ्रेमवर्क इसका समर्थन करता है। अंत में, GORM एक बहुत अच्छा आवरण है जिसके चारों ओर यह गतिशील खोजकर्ता कर रहा है और ग्रूवी का उपयोग कर रहा है।
इसे .NET (NHibernate) में भी पोर्ट किया गया है, ताकि आप इसे वहां भी इस्तेमाल कर सकें।
हाइबरनेट करें, क्योंकि यह:
ORM का उपयोग करने के लिए (और क्यों) पर कुछ बिंदु:
जब मैं एक मध्यम आकार के JavaSE एप्लिकेशन को लिख रहा था तो मुझे Avaje Ebean के साथ वास्तव में अच्छा अनुभव था।
यह संस्थाओं को परिभाषित करने के लिए मानक JPA एनोटेशन का उपयोग करता है, लेकिन एक बहुत ही सरल API (कोई EntityManager या उस संलग्न / अलग संस्थाओं में से कोई भी बकवास) को उजागर नहीं करता है। यह आवश्यक होने पर आपको आसानी से SQL क्वेरी या ईवेंट सादे JDBC कॉल का उपयोग करने देता है।
इसमें प्रश्नों के लिए एक बहुत अच्छा तरल पदार्थ और प्रकार-सुरक्षित एपीआई भी है। आप इस तरह की बातें लिख सकते हैं:
List<Person> boys = Ebean.find(Person.class)
.where()
.eq("gender", "M")
.le("age", 18)
.orderBy("firstName")
.findList();
सरल , क्योंकि यह सीधा-आगे है और कोई जादू नहीं है। यह जावा कोड में सभी मेटा डेटा संरचनाओं को परिभाषित करता है और बहुत लचीला है।
मेमोरी में जावा ऑब्जेक्ट के लिए रिलेशनल डेटाबेस में डेटा मैप करके सिंपल हाइबरनेट को समान कार्यक्षमता प्रदान करता है। जावा ऑब्जेक्ट्स के संदर्भ में क्वेरी निर्दिष्ट की जा सकती हैं, ऑब्जेक्ट की पहचान डेटाबेस कुंजी के साथ गठबंधन की जाती है, ऑब्जेक्ट्स के बीच संबंध बनाए रखा जाता है और संशोधित ऑब्जेक्ट्स स्वचालित रूप से आशावादी तालों के साथ डेटाबेस में प्रवाहित होते हैं।
लेकिन हाइबरनेट के विपरीत, SimpleORM एक बहुत ही सरल वस्तु संरचना और वास्तुकला का उपयोग करता है, जो जटिल पार्सिंग, बाइट कोड प्रोसेसिंग आदि की आवश्यकता से बचा जाता है। सिंपल छोटा और पारदर्शी होता है, आकार में सिर्फ 79K और 52K के दो जार में पैक किया जाता है, जिसमें केवल एक छोटा और वैकल्पिक होता है। निर्भरता (Slf4j)। (हाइबरनेट 2400K प्लस से अधिक 2000K निर्भर जार के बारे में है।) इससे सिंपल को समझना आसान हो जाता है और इसलिए तकनीकी जोखिम बहुत बढ़ जाता है।
ग्रहण लिंक , कई कारणों से, लेकिन विशेष रूप से मुझे ऐसा लगता है कि इसमें अन्य मुख्य धारा के समाधानों की तुलना में कम ब्लोट है (कम से कम आपके चेहरे पर ब्लोट)।
ओह और एक्लिप्स लिंक को जेपीए 2.0 के लिए संदर्भ कार्यान्वयन के लिए चुना गया है
जब मैं फ्री-फ़ॉर्म SQL प्रश्नों के लिए जावा प्रतिस्थापन के बारे में चिंताओं को साझा करता हूं, तो मुझे वास्तव में लगता है कि ORM की आलोचना करने वाले लोग आमतौर पर खराब एप्लिकेशन डिज़ाइन के कारण ऐसा कर रहे हैं।
True OOD कक्षाओं और रिश्तों द्वारा संचालित होता है, और ORM आपको विभिन्न संबंधों के प्रकारों और वस्तुओं की निरंतर मैपिंग देता है। यदि आप ORM टूल का उपयोग करते हैं और जो भी बोली भाषा ORM फ्रेमवर्क का समर्थन करता है (जिसमें शामिल हैं, लेकिन जावा एक्सप्रेशन ट्री, क्वेरी विधि, OQL आदि तक सीमित नहीं है) में कोडिंग क्वेरी एक्सप्रेशंस समाप्त करते हैं, तो आप निश्चित रूप से कुछ गलत कर रहे हैं, अर्थात आपका क्लास मॉडल सबसे अधिक संभावना यह है कि यह चाहिए जिस तरह से अपनी आवश्यकताओं का समर्थन नहीं करता है। एक साफ आवेदन डिजाइन वास्तव में आवेदन स्तर पर प्रश्नों की जरूरत नहीं है। मैं कई परियोजनाओं को उसी तरह से ओआरएम फ्रेमवर्क का उपयोग करके शुरू कर रहा हूं जैसे कि वे अपने कोड में एसक्यूएल स्ट्रिंग स्थिरांक को एम्बेड करने के लिए उपयोग किए गए थे, और अंत में सभी को इस बात के बारे में आश्चर्यचकित किया गया था कि एक बार जब आप मिलान करते हैं तो पूरा आवेदन कितना सरल और रखरखाव योग्य हो जाता है। उपयोग मॉडल के साथ अपने वर्ग मॉडल को ऊपर रखें। दी गई, खोज की कार्यक्षमता जैसी चीज़ों के लिए, आपको एक क्वेरी भाषा की आवश्यकता है, लेकिन फिर भी क्वेरीज़ इतनी अधिक विवश हैं कि एक जटिल दृश्य और मानचित्रण भी बना रहा है कि केवल पढ़ने के लिए एक निरंतर वर्ग बहुत अच्छा है बनाए रखने और अभिव्यक्ति की तुलना में देखने के लिए आपके आवेदन के कोड में कुछ क्वेरी भाषा में। VIEW दृष्टिकोण भी डेटाबेस क्षमताओं का लाभ उठाता है और, सामग्रीकरण के माध्यम से, आपके जावा स्रोत में किसी भी हाथ से लिखे SQL की तुलना में बेहतर प्रदर्शन-वार हो सकता है। इसलिए, मुझे गैर-तुच्छ एप्लिकेशन के लिए ORM का उपयोग न करने का कोई कारण नहीं दिखता है। लेकिन फिर भी प्रश्न इतने विवश हैं कि एक जटिल दृश्य और मानचित्रण भी बनाते हैं कि आपके आवेदन के कोड में कुछ क्वेरी भाषा में अभिव्यक्तियों के निर्माण की तुलना में केवल पढ़ने के लिए एक निरंतर कक्षा के लिए बहुत अच्छा है। VIEW दृष्टिकोण भी डेटाबेस क्षमताओं का लाभ उठाता है और, सामग्रीकरण के माध्यम से, आपके जावा स्रोत में किसी भी हाथ से लिखे SQL की तुलना में बेहतर प्रदर्शन-वार हो सकता है। इसलिए, मुझे गैर-तुच्छ एप्लिकेशन के लिए ORM का उपयोग न करने का कोई कारण नहीं दिखता है। लेकिन फिर भी प्रश्न इतने विवश हैं कि एक जटिल दृश्य और मानचित्रण भी बनाते हैं कि आपके आवेदन के कोड में कुछ क्वेरी भाषा में अभिव्यक्तियों के निर्माण की तुलना में केवल पढ़ने के लिए एक निरंतर कक्षा के लिए बहुत अच्छा है। VIEW दृष्टिकोण भी डेटाबेस क्षमताओं का लाभ उठाता है और, सामग्रीकरण के माध्यम से, आपके जावा स्रोत में किसी भी हाथ से लिखे SQL की तुलना में बेहतर प्रदर्शन-वार हो सकता है। इसलिए, मुझे गैर-तुच्छ एप्लिकेशन के लिए ORM का उपयोग न करने का कोई कारण नहीं दिखता है।