2012-01-26 18 views
5

मेरे पास एक सार वर्ग और दो उप वर्ग हैं जो इसे बढ़ाते हैं। मुझे लगता है मैं निम्न विधियोंवसंत @ ट्रांसेक्शन एनोटेशन

public void importDataToDB(){ 
    //all the good stuff goes in here 
} 

@Transactional 
public void executeInsertUpdateQuery(){ 
    //all the good stuff goes in here 
} 

मेरे जावा कोड

ImportConfigFiles importConfigFiles = (ImportConfigFiles)context.getBean("importConfigFile"); 
importConfigFiles.setFileLocation(destPath); 
importConfigFiles.importDataToDB(); 

यह काम नहीं करता है मेरी अमूर्त वर्ग में वसंत कॉन्फ़िग फ़ाइल

<bean id="importConfigFile" class="xxx.ImportConfigFiles" parent="parentImportFile"></bean> 

<bean id="importFile" class="xxx.ImportUMTSKPIFiles" parent="parentImportFile"></bean> 

<bean id="parentImportFile" name="parentImportFile" class="xxx.ImportUMTSFiles" abstract="true"></bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

में निम्नलिखित है। executeInsertUpdateQuery() केवल एक देशी एसक्यूएल क्वेरी निष्पादित करता है। अगर मैं imortDataToDB पर @Transactional डालता हूं() यह काम करता है लेकिन फिर यह उस विधि के अंदर से मेरा लेनदेन बड़ा बनाता है, मैं फ़ाइल में सभी पंक्तियों के माध्यम से लूप करता हूं और डीबी में रिकॉर्ड डालता हूं।

उत्तर

8

इस वसंत में प्रमुख नुकसान में से एक है - अगर आप एक ही कक्षा में गैर लेन-देन विधि से @Transactional -method फोन, @Transactional नजरअंदाज कर दिया है (जब तक आप AspectJ बुनाई का उपयोग करें)। यह स्प्रिंग समस्या प्रति से नहीं है - ईजेबी की एक ही कमी है।

इंटरफ़ेस आधारित और वर्ग आधारित प्रॉक्सी के साथ दुर्भाग्य से सब आप कर सकते हैं दो में अपने वर्ग विभाजित करने के लिए है:

public class BeanA() { 

    @Resource 
    private BeanB b; 

    public void importDataToDB(){ 
     b.executeInsertUpdateQuery(); 
    } 
} 

public class BeanB { 

    @Transactional 
    public void executeInsertUpdateQuery(){ 
     //all the good stuff goes in here 
    } 

} 

पूरे ऊधम वसंत में AOP की प्रॉक्सी आंतरिक कार्यान्वयन के कारण होता है। गैर-लेनदेन BeanA से b.executeInsertUpdateQuery() पर कॉल करते समय हर बार नए लेनदेन के ऊपर कोड शुरू किया जाएगा।

मैंने इसके बारे में अपने ब्लॉग Spring pitfalls: proxying, Spring AOP riddle और Spring AOP riddle demystified पर लिखा था।

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। – user373201

0

बिल्कुल यकीन नहीं है, सवाल क्या है, लेकिन @Transactional एक लेनदेन में पूरी विधि को लपेटता है तो जाहिर है कि अगर आप सब कुछ एक विधि में आयात करते हैं तो यह बहुत बड़ा होगा। लाभ यह है कि अगर किसी स्थान पर आपका आयात विफल हो जाता है, तो संपूर्ण लेनदेन निष्पादित नहीं होगा और आपके डेटाबेस में कोई दोषपूर्ण डेटा नहीं है।

यदि आप यह नहीं चाहते हैं, तो आपको अपने लेनदेन का प्रबंधन करना होगा या अपने डेटा के सबसेट के लिए @Transactional एनोटेटेड विधि को कॉल करना होगा, जैसे कि आप अभी एक आयात के लिए कर रहे हैं, लेकिन हो सकता है कि आप इसे करें 10 फाइलों या अन्य उदाहरण के लिए तार्किक प्रतिबंध।

संबंधित मुद्दे