जेपीए (जावा पर्सिस्टेंस एपीआई, मूल रूप से जावा / जे 2 ईई / ईजेबी के लिए मानकीकृत ओआरएम एपीआई), जिसमें हाइबरनेट, एक्लिप्सलिंक, टॉपलिंक, ओपनजेपीए और अन्य शामिल हैं, के साथ काम करने वाले किसी व्यक्ति के रूप में बोलते हुए, मैं अपने कुछ हिस्से साझा करूंगा। टिप्पणियों।
- ओआरएम तेज नहीं हैं। वे पर्याप्त हो सकते हैं और अधिकांश समय पर्याप्त है ठीक है लेकिन उच्च-मात्रा वाले कम-विलंबता वातावरण में वे एक नहीं-नहीं हैं;
- जावा और सी # जैसी सामान्य प्रयोजन प्रोग्रामिंग भाषाओं में आपको उन्हें काम करने के लिए एक भयानक जादू की आवश्यकता होती है (जैसे जावा, इंस्ट्रूमेंटेशन आदि में लोड-टाइम बुनाई);
- ओआरएम का उपयोग करते समय, एसक्यूएल से आगे निकलने के बजाय (जो कि इरादे से प्रतीत होता है), आप हैरान होंगे कि आप एक्सएमएल और / या एनोटेशन / विशेषताओं को खर्च करने में कितना समय लगाते हैं और अपने एसटीएम को प्रदर्शनकारी एसक्यूएल उत्पन्न करने के लिए प्राप्त करते हैं;
- जटिल प्रश्नों के लिए, वास्तव में कोई विकल्प नहीं है। जैसे जेपीए में कुछ प्रश्न हैं जो केवल संभव नहीं हैं जो कच्चे एसक्यूएल में हैं और जब आपको जेपीए में कच्चे एसक्यूएल का उपयोग करना है तो यह सुंदर नहीं है (सी # / नेट कम से कम डायनेमिक प्रकार - var - जो बहुत है। ऑब्जेक्ट ऑब्जेक्ट की तुलना में अच्छे);
- ओआरएम का उपयोग करते समय बहुत सारे "गोच" होते हैं। इसमें अनपेक्षित या अनपेक्षित व्यवहार शामिल है, यह तथ्य कि आपको अपने डेटाबेस में SQL अपडेट्स करने के लिए JPA या इसी तरह के तरीकों से SQL अपडेट करने की क्षमता का निर्माण करना है क्योंकि JPA डिफ़ॉल्ट रूप से सब कुछ कैश करता है इसलिए यह एक सीधा डेटाबेस को नहीं पकड़ेगा अद्यतन - प्रत्यक्ष एसक्यूएल अद्यतन चलाना एक सामान्य उत्पादन समर्थन गतिविधि है);
- ऑब्जेक्ट-रिलेशनल मिसमैच हमेशा समस्याएं पैदा करने वाला होता है। ऐसी किसी भी समस्या के साथ अमूर्तता की जटिलता और पूर्णता के बीच एक व्यापार है। कई बार मुझे लगा कि जेपीए बहुत दूर चला गया और कम रिटर्न का एक वास्तविक कानून मारा, जहां जटिलता हिट अमूर्त द्वारा उचित नहीं थी।
एक और समस्या है जो थोड़ा और स्पष्टीकरण लेती है।
वेब एप्लिकेशन के लिए पारंपरिक मॉडल में एक दृढ़ता परत और एक प्रस्तुति परत होती है (संभवतः बीच में एक सेवाओं या अन्य परतों के साथ लेकिन ये इस चर्चा के लिए महत्वपूर्ण दो हैं)। ORMs आपकी दृढ़ता परत से लेकर प्रस्तुति परत (यानी आपकी इकाइयाँ) तक के कठोर दृश्य को बल देते हैं।
अधिक कच्चे SQL तरीकों की आलोचनाओं में से एक यह है कि आप इन सभी VO (मान ऑब्जेक्ट) या DTOs (डेटा ट्रांसफर ऑब्जेक्ट) के साथ समाप्त होते हैं जो केवल एक क्वेरी द्वारा उपयोग किए जाते हैं। इसे ORM के लाभ के रूप में टाल दिया जाता है क्योंकि आप इससे छुटकारा पा लेते हैं।
बात यह है कि उन समस्याओं को ओआरएम के साथ दूर नहीं जाना है, वे बस प्रस्तुति परत तक जाते हैं। प्रश्नों के लिए VO / DTO बनाने के बजाय, आप कस्टम प्रस्तुति ऑब्जेक्ट बनाते हैं, आमतौर पर प्रत्येक दृश्य के लिए। यह कैसे बेहतर है? IMHO यह नहीं है।
मैंने इसके बारे में ORM या SQL में लिखा है : क्या हम अभी तक वहाँ हैं? ।
मेरी पसंद की तकनीक (जावा में) इन दिनों इब्तिदा है। यह SQL के चारों ओर एक बहुत पतला आवरण है जो 90% + करता है जो JPA कर सकता है (यह रिश्तों की आलसी-लोडिंग भी कर सकता है, हालांकि इसकी अच्छी तरह से प्रलेखित नहीं है) लेकिन बहुत कम ओवरहेड (जटिलता और वास्तविक कोड के संदर्भ में) के साथ।
यह पिछले साल एक GWT आवेदन मैं लिख रहा था में आया था। सेवा कार्यान्वयन में EclipseLink से प्रस्तुति ऑब्जेक्ट्स में अनुवाद के बहुत सारे। यदि हम ibatis का उपयोग कर रहे हैं, तो यह ibatis के साथ उपयुक्त ऑब्जेक्ट बनाने के लिए कहीं अधिक सरल होगा और फिर उन्हें सभी तरह से ऊपर और नीचे स्टैक से गुजारें। कुछ शुद्धतावादियों का तर्क हो सकता है कि यह Bad ™ है। हो सकता है कि ऐसा (सिद्धांत रूप में) लेकिन मैं आपको बताता हूं: यह सरल कोड, एक सरल स्टैक और अधिक उत्पादकता के लिए नेतृत्व करेगा।