स्प्रिंग डेटा के साथ @ ट्रेंसाशनल का उपयोग कैसे करें?


82

मैंने बस एक स्प्रिंग-डेटा, हाइबरनेट, MySQL, JPA प्रोजेक्ट पर काम करना शुरू किया। मैंने स्प्रिंग-डेटा पर स्विच किया ताकि मुझे हाथ से प्रश्न बनाने के लिए परेशान न होना पड़े।

मैंने देखा कि @Transactionalजब आप एनोटेशन के बिना भी अपने प्रश्नों को आज़माते हैं, तो वसंत-डेटा का उपयोग करने के लिए आवश्यक नहीं है।

क्या कोई विशिष्ट कारण है कि मुझे @Transactionalएनोटेशन का उपयोग नहीं करना चाहिए / नहीं करना चाहिए ?

काम करता है:

@Transactional
public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

यह भी काम करता है:

public List listStudentsBySchool(long id) {
    return repository.findByClasses_School_Id(id);
}

अग्रिम में धन्यवाद!

जवाबों:


141

आपका प्रश्न वास्तव में किस बारे में है? @Repositoryएनोटेशन का उपयोग या @Transactional

@Repositoryइस बात की बिल्कुल भी जरूरत नहीं है कि आपके द्वारा घोषित किए गए इंटरफ़ेस को एक प्रॉक्सी द्वारा समर्थित किया जाएगा जो स्प्रिंग डेटा इन्फ्रास्ट्रक्चर बनाता है और वैसे भी अपवाद अनुवाद को सक्रिय करता है। इसलिए स्प्रिंग डेटा रिपॉजिटरी इंटरफ़ेस पर इस एनोटेशन का उपयोग करने से कोई प्रभाव नहीं पड़ता है।

@Transactional- जेपीए मॉड्यूल के लिए हमारे पास यह टिप्पणी एनोटेशन कार्यान्वयन वर्ग पर प्रॉक्सी ( SimpleJpaRepository) के समर्थन में है । यह दो कारणों से है: पहला, वस्तुओं को बनाए रखना और हटाना जेपीए में लेनदेन की आवश्यकता है। इस प्रकार हमें यह सुनिश्चित करने की आवश्यकता है कि एक लेन-देन चल रहा है, जिसे हम विधि के साथ एनोटेट करके करते हैं @Transactional

जैसे तरीकों पढ़ना findAll()और findOne(…)प्रयोग कर रहे हैं @Transactional(readOnly = true)जो सख्ती से आवश्यक नहीं है लेकिन लेन-देन के बुनियादी ढांचे में कुछ अनुकूलन चलाता है (स्थापित करने FlushModeके लिए MANUALदृढ़ता प्रदाताओं संभावित गंदा चेकों को छोड़ जब बंद करने जाने के लिए EntityManager)। इससे परे कि झंडा JDBC कनेक्शन पर भी सेट है, जो उस स्तर पर और अनुकूलन का कारण बनता है।

आप किस डेटाबेस का उपयोग करते हैं इसके आधार पर तालिका के ताले को छोड़ सकते हैं या यहां तक ​​कि उन लेखन कार्यों को अस्वीकार कर सकते हैं जिन्हें आप गलती से ट्रिगर कर सकते हैं। इस प्रकार हम आपको @Transactional(readOnly = true)क्वेरी विधियों के लिए उपयोग करने की सलाह देते हैं जो आप आसानी से उस एनोटेशन को रिपॉजिटरी इंटरफेस में जोड़ सकते हैं। सुनिश्चित करें कि आपने @Transactionalउस इंटरफ़ेस में हेरफेर करने के तरीकों में एक सादा जोड़ दिया है या घोषित किया है।


9
तो संक्षेप में: मुझे अपने सभी डीएओ-विधियों पर चुनिंदा प्रश्नों पर ऐड / एडिट / डिलीट क्वैश्चंस और @ ट्रांसशिप (रीडऑनली = ट्रू) पर @ ट्रेंसेक्शनल का उपयोग करना चाहिए?
बायरन वूरबैक

21
बिल्कुल सही। ऐसा करने का सबसे आसान तरीका @Transactional(readOnly = true)इंटरफ़ेस पर उपयोग करना है (क्योंकि इसमें आमतौर पर अधिकतर खोजक विधियां होती हैं) और सादे के साथ प्रत्येक संशोधित क्वेरी पद्धति के लिए इस सेटिंग को ओवरराइड करता है @Transactional। यह वास्तव में जिस तरह से यह किया गया है SimpleJpaRepositoy
ओलिवर ड्रोट्बोहम

@ व्यापक स्पष्टीकरण के लिए धन्यवाद। लेकिन अन्य लिंक [लेन-देन-गड्ढे- पड़ाव ] < ibm.com/developerworks/java/library/j-ts1/index.html#listing8 > से गुजरते समय । यह कहता है " निचला रेखा यह है कि जब आप ORM- आधारित फ्रेमवर्क का उपयोग करते हैं, तो केवल-पढ़ने वाला ध्वज काफी बेकार होता है और अधिकांश मामलों में इसे अनदेखा कर दिया जाता है। लेकिन यदि आप अभी भी इसका उपयोग करने पर जोर देते हैं, तो हमेशा समर्थन मोड को SUPPORTS पर सेट करें " । । इसे पढ़ने के बाद मुझे यकीन नहीं है कि मुझे अकेले (सच में = सच) का उपयोग करना चाहिए .. क्या इसका उपयोग हमेशा समर्थन मोड के साथ समर्थन के रूप में किया जाना चाहिए।
अनुपम गुप्ता

9
लेख के इस खंड में सब कुछ बंद करना गलत है। यह इंगित करके कि आप लिख नहीं रहे हैं, JDBC संचालित (विल) DB इंटरैक्शन के लिए प्रदर्शन में सुधार कर सकता है। यह गलती से जारी किए गए लेखन को भी पहचान सकता है और अस्वीकार कर सकता है। उसके शीर्ष पर, स्प्रिंग जेपीए / हाइबरनेट को रीड मोड में फ्लश करने में अक्षम कर देता है जो कि बड़े ऑब्जेक्ट ग्राफ को पढ़ने के मामले में प्रदर्शन को बेहद प्रभावित कर सकता है क्योंकि प्रदाता को उस पर गंदे चेक करने की आवश्यकता नहीं होती है। ध्वज का हालांकि लेन-देन पर बड़ा प्रभाव नहीं हो सकता है, लेकिन अब तक इस पर विचार नहीं किया गया है।
ओलिवर ड्रोट्बोहम

मैं बड़े ऑब्जेक्ट ग्राफ़ के मामले में प्रदर्शन सुधार के लिए वाउच कर सकता हूं या बड़ी संख्या में प्रबंधित वस्तुओं को लोड करने वाले मामलों का उपयोग कर सकता हूं।
शैलेन्द्र

3

मुझे लगता है कि सवाल थोड़ा व्यापक है और डेटा एक्सेस लेयर पर एनोटेशन पर कम नहीं किया जा सकता है। हमें आवेदन के पूरे ढेर पर विचार करने की आवश्यकता है, लेन-देन की रणनीतियों जिसे हम लागू करना चाहते हैं और इसी तरह। इस विषय पर आईबीएम डेवलपरवर्क्स साइट पर मार्क रिचर्ड्स द्वारा लेखों का एक बहुत व्यापक सेट है। आप यहाँ पहले एक पा सकते हैं: https://developer.ibm.com/articles/j-ts1/

सादर


2

आपको @Repositoryएनोटेशन का उपयोग करना चाहिए

इसका कारण यह है कि @Repositoryआपके अनियंत्रित SQL अपवाद को स्प्रिंग एक्सपटेशन में अनुवाद करने के लिए उपयोग किया जाता है और केवल वही अपवाद जो आपको चाहिएDataAccessException


10
स्प्रिंग का उपयोग करते समय यह सामान्य रूप से सही है, लेकिन चूंकि स्प्रिंग डेटा रिपॉजिटरी पहले से ही स्प्रिंग प्रॉक्सी द्वारा समर्थित हैं - @ रिपॉजिटरी का उपयोग करने से कोई फर्क नहीं पड़ता है।
एलेक्जेंडर ब्लोम्स्कोल्ड

0

हम रिकॉर्ड को लॉक करने के लिए @Transactional एनोटेशन का भी उपयोग करते हैं ताकि किसी अन्य थ्रेड / अनुरोध को रीड नहीं बदले।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.