2009-10-18 17 views
5

वसंत के लिए नए और यहाँ @stackoverflowस्प्रिंग @Transactional विलय और सवाल

मैं एक स्टैंड-अलोन सूची का निर्माण कर रहा हूँ जारी रहती है & बिक्री एक वितरक व्यापार के लिए ट्रैकिंग एप्लिकेशन (अपाचे धुरी/स्प्रिंग/जेपीए/हाइबरनेट/MySQL) ।

अब तक मुझे लगता है कि सबकुछ सीआरयूडी है, इसलिए मैं सब कुछ @ ट्रान्सैक्शनल के साथ बेस क्लास रखने की योजना बना रहा हूं।

तब मुझे अपनी बचत जेनेरिक विधि में कोई समस्या मिली। वसंत से EntityManager की विधि को जारी और मर्ज करने में कोई फर्क पड़ता है?

मैंने दौड़ने की कोशिश की और दोनों को सम्मिलित करने और अपडेट करने के लिए सहेजने का प्रयास किया और यह ठीक काम किया (मुझे लगता है कि हर बार जब मैं अपनी सहेजने वाली विधि को कॉल करता हूं तो वसंत स्वचालित रूप से इकाई को रीफ्रेश करता है // मैंने हाइबरनेट क्वेरी लॉग इन की है, क्या यह सही है?)।

@Transactional 
public abstract class GenericDAO { 

    protected EntityManager em; 

// em [email protected]/setter 

    public void save(T t) { 
//  if (t.getId() == null) // create new 
//  { 
//   em.persist(t); 
//  } else // update 
//  { 
      em.merge(t); 
//  } 
    } 
} 

और बीटीडब्ल्यू, इस तरह एक सेटअप होने के साथ, मैं सही समझौता प्रदर्शन नहीं करूँगा? रिपोर्ट बनाने के लिए salesDAO.findAll() को कॉल करने की तरह (जिसे लेनदेन करने की आवश्यकता नहीं है, है ना?)।

धन्यवाद !!!

उत्तर

5

This SO question लगातार बनाम विलय की अच्छी चर्चा है, और स्वीकृत उत्तर इसे बहुत अच्छी तरह से समझाता है। दूसरा जवाब इसके बारे में एक अच्छी ब्लॉग पोस्ट से भी जुड़ा हुआ है।

this other post में पहले उत्तर के मुताबिक, ऐसा लगता है कि किसी इकाई को सहेजने और अपडेट करने के लिए विलय करना संभव होगा, लेकिन ऐसा नहीं है कि मैंने इसे कैसे किया है। मेरे स्प्रिंग/जेपीए ऐप्स में, मेरे पास सिर्फ डीएओ जेपीडाओ सपोर्ट का विस्तार करते हैं और getJpaTemplate() को निम्न तरीके से उपयोग करते हैं।

/** 
* Save a new Album. 
*/ 
public Album save(Album album) { 
    getJpaTemplate().persist(album); 
    return album; 
} 

/** 
* Update an existing Album. 
*/ 
public Album update(Album album) { 
    return getJpaTemplate().merge(album); 
} 
+0

मैं अतिथि यह जाने का सबसे आसान तरीका है। तो यदि मेरे पास JpaDaoSupport है, और मुझे इससे एक इकाई मिलती है, तो कोई भी परिवर्तन स्वचालित रूप से किया जाएगा? मुझे लगता है कि मेरे पास सहेजने के तरीके के दो प्रकार होंगे, जो एक बनी रहती है और जो फ्लश कहती है। इस पर कोई टिप्पणी? – thirdy

+0

क्या आपका मतलब सुरक्षित या अपडेट किए बिना प्रतिबद्ध है? यदि ऐसा है, तो मैं ऐसा नहीं सोचूंगा, मैं हमेशा एक नई इकाई पर सहेजता हूं या मौजूदा रहने के लिए अद्यतन करता हूं। मुझे फ्लश विधि को कॉल करने की आवश्यकता नहीं है, लेकिन किसी भी दिए गए अनुरोध के लिए मेरी डीबी एक्सेस बहुत सरल है। –

+0

मुझे अब के लिए वसंत की कोशिश करनी होगी। बस उत्सुक, Grails इस पर कैसे सुधार करता है? मुझे Grails में इन तरह की समस्याओं का सामना करना पड़ेगा? उत्तर देने के लिए – thirdy

4

link दूसरे से तो सवाल Kaleb पोस्ट() बनाम मर्ज() जारी रहती है की मतभेद और gotchas को कवर का एक अच्छा काम करने से करता है। हालांकि, मैंने हमेशा अपने दाओ वर्गों को एक सेव() विधि के साथ कार्यान्वित किया है जो केवल इंसर्ट और अपडेट दोनों को संभालने के लिए विलय() को कॉल करता है, और मैंने कभी भी किसी भी लगातार() बनाम विलय() गेटचास में भाग नहीं लिया है।

जहां तक ​​प्रदर्शन और व्यवहार तरीके के रूप में: वास्तव में, प्रदर्शन प्रभावित नहीं होगा हालांकि मैं विधि स्तर पर व्याख्या का उपयोग करना सिर्फ इसलिए मैं आसानी से बता सकते हैं जो तरीकों अपडेट कर रहे हैं पसंद करते हैं तरीकों पर @Transactional का उपयोग करना है कि केवल संचालन पढ़ रहे हैं और जो पढ़ रहे हैं। @Transactional एनोटेशन पर readOnly विशेषता सेट करके आप ऐसा कर सकते हैं।

आप अपने तरीकों में एक नामकरण परंपरा (यानी किसी भी पढ़ने विधि हमेशा getXXX साथ शुरू होता है) का पालन करें, तो आप भी poincut वाक्य रचना अपने स्प्रिंग कॉन्फ़िग फ़ाइल में स्वचालित रूप से इस भेदभाव बनाने के लिए इस्तेमाल कर सकते हैं:

<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
     <tx:method name="get*" read-only="true"/> 
     <tx:method name="*"/> 
    </tx:attributes> 
    </tx:advice> 

देखें अधिक जानकारी के लिए Spring documentation on Transactions

इसके अलावा, मैं आमतौर पर @Transactional एक सेवा परत में, मेरे दाओ वर्गों के ऊपर एक स्तर को विशेषता देता हूं। दाओ कक्षाओं के तरीके प्रत्येक विधि कॉल के लिए अलग डेटाबेस संचालन होते हैं, जबकि सेवा विधियां अद्यतनों की एक श्रृंखला के लिए एकल प्रतिबद्ध/रोलबैक कर सकती हैं।

+0

धन्यवाद। मुझे लगता है कि मैं शुद्ध जेपीए के साथ रहूंगा, (मुझे लचीलापन की ज्यादा आवश्यकता नहीं है) – thirdy

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