2012-06-09 25 views
16

का उपयोग नहीं कर सकता है मेरे पास मेरे गैर-ईजेबी एप्लिकेशन में निम्न कोड कैसे है। कोड काम करता है।एक जेटीए EntityManager getTransaction()

@Override 
public void saveItems(Collection<T> items) { 
    synchronized (em) { 
     EntityTransaction tx = em.getTransaction(); 
     try { 
      tx.begin(); 
      for (T item : items) { 
       saveItem_((Class<T>) null, item); 
      } 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 
    } 
} 

एक नया आवेदन में मैं EJB3 + JSF उपयोग कर रहा हूँ और इसके बाद के संस्करण कोड युक्त पुस्तकालय का फिर से उपयोग करना चाहते हैं। नए आवेदन के लिए मेरे peristence इकाई इस तरह दिखता है:

<persistence-unit name="myApp" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>MySQLConnection</jta-data-source> 
    </persistence-unit> 

मेरा नया आवेदन जब यह इस लाइन हिट एक अपवाद फेंक:

EntityTransaction tx = em.getTransaction(); 

अपवाद है:

A JTA EntityManager cannot use getTransaction() 

है कौन सा पर्याप्त रूप से स्पष्ट। प्रश्न यह है कि मैं कंटेनर द्वारा प्रबंधित लेनदेन करने के लिए अपने कोड को कैसे परिवर्तित करूंगा। संभवतः मेरे बीन तरीकों को उचित रूप से एनोटेट करने की आवश्यकता है ... सवाल यह है कि कैसे?

उत्तर

12

EntityTransaction प्रकार संसाधन स्थानीय की इकाई प्रबंधक के साथ प्रयोग किया जाता है। यदि आप जेटीए का उपयोग करना चाहते हैं, तो UserTransaction इंटरफ़ेस का उपयोग करना होगा।

प्रलेखन से: EntityTransaction - इंटरफेस संसाधन-स्थानीय इकाई प्रबंधकों पर लेनदेन को नियंत्रित करने के लिए उपयोग किया जाता है। EntityManager.getTransaction() विधि EntityTransaction इंटरफ़ेस देता है।


संपादित करें: जोड़ा गया छद्म कोड।

@Resource 
private SessionContext sessionContext; 

void execute(){ 

UserTransaction userTxn = sessionContext.getUserTransaction(); 

try{ 

userTxn.begin(); 
/** 
    * do-something 
    */ 
userTxn.commit(); 

    } catch(Throwable e){ 
    userTxn.rollback(); //-- Include this in try-catch 
    } 
} 
+3

तो यहां समाधान क्या है? – rtcarlson

+0

@rtcarlson क्यों डाउनवॉट किया गया है और मैंने 'पोस्टट्रांसक्शन' इंटरफ़ेस का उपयोग करने के लिए अपनी पोस्ट में साफ़ नहीं किया है। –

+0

@downvoter यदि आप समझा नहीं सकते और समझ नहीं सकते हैं, तो बिना किसी कारण के डाउनवोट करें। –

4

सबसे सरल मामले में - यह बस काम करता है। यदि आपके पास एंटिटी मैनेजर ईजेबी में इंजेक्शन है और कोई विशेष एनोटेशन नहीं है, तो लेनदेन पहले ईजेबी विधि में खुल जाएगा (इसका मतलब है कि यदि ईजेबीए ईजेबीबी को कॉल करता है और बदले में ईजेबीसी को कॉल करता है, तो सभी ईजेबी विधियों में केवल एक लेनदेन का उपयोग किया जाएगा)। यदि आप संशोधित करना चाहते हैं कि लेन-देन कैसे नियंत्रित होते हैं, तो @ ट्रान्सएक्शन देखें। (रोलबैक = true)

एक रोलबैक करने के लिए सबसे आसान तरीका है एक अपवाद @ApplicationException के साथ चिह्नित फेंकने के लिए है

मैं गलत हो सकता है, लेकिन अपने कोड से पहचानने आप बढ़ाया और सामान्य के बीच के अंतर पर पढ़ना चाहिए EntityManager। ऐसा लगता है कि आप एक विस्तारित एम का उपयोग बहुत अजीब तरीके से कर रहे हैं (लेनदेन से बाहर लूप को आगे बढ़ने से आपको अंततः छुटकारा पाने में मदद मिलेगी)।

छोटे संपादित करें: अगर आप UserTransaction इस्तेमाल करने की कोशिश, के रूप में अन्य पोस्ट पता चलता है, तो आपको एक त्रुटि है, क्योंकि एक मानक EntityManager (कि आप शायद का उपयोग कर रहे हैं) तथाकथित CMT (कंटेनर प्रबंधित लेन-देन) का उपयोग करता मिल जाएगा। यह मत छुओ, जब तक आप तीन बुनियादी opositions (अगर आप चाहते हैं, मैं विस्तार से बता सकते हैं, लेकिन स्पष्ट रूप से, आप इसे की जरूरत नहीं होगी) को समझते हैं:

  • कंटेनर EntityManager कामयाब बनाम आवेदन कामयाब EntityManager,
  • कंटेनर प्रबंधित लेनदेन बनाम अनुप्रयोग प्रबंधित लेनदेन,
  • सामान्य इकाई प्रबंधक और विस्तारित EntityManager।

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

  • कोई संबंधित समस्या नहीं^_^