2011-09-30 13 views
14

यह एक अकादमिक प्रश्न है; मेरे पास इसके संबंध में कोई टूटा कोड नहीं है। मैं बस हुड के तहत क्या हो रहा है की मेरी समझ का विस्तार करना चाहता हूं।उपयोगकर्ता ट्रांज़ेक्शन और EntityManager कैसे इंटरैक्ट करता है?

कोड पैटर्न मैं उपयोग कर रहा है मेरी ठेठ JSF वेब अनुप्रयोगों के लिए मेरी जेपीए डीएओ में (किताबें और ट्यूटोरियल से नकल) मूल रूप से यह है:

public class someDAO { 

    @PersistenceContext protected EntityManager em; 
    @Resource   private UserTransaction utx;  

    public void persist(Entity entity) { 
     try { 
      utx.begin(); 
      em.persist(entity); 
      utx.commit(); 
     } catch (// gawd awful long list of possible exceptions) 

     // etc 

तो मेरे सवालों का इस प्रकार हैं:

  1. EntityManager इंस्टेंस और उपयोगकर्ता ट्रांज़ेक्शन उदाहरण दो प्रतीत होता है कि असंबंधित संकुलों से एनोटेशन के साथ इंजेक्शन क्यों दिया जाता है?

  2. @ManagedProperty के बजाय एनोटेशन @Resource और @PersistenceContext क्यों है या शायद @ इंजेक्ट का उपयोग किया जाता है?

  3. कैसे () विधि का उपयोग जारी रहती है और UTX वस्तु के साथ बातचीत करता है? अगर मैं utx.begin() को भूल जाता हूं तो इकाई प्रबंधक को इसके बारे में पता है और फेंकता है और अपवाद है। यह कुछ जादू तरीके से UserTransaction ऑब्जेक्ट को ढूंढना चाहिए। इंटरफ़ेस को परिभाषित करने के लिए यह बेहतर आर्किटेक्चर नहीं होगा: em.persistist (utx, entity)?

  4. यदि utx कुछ प्रकार का सिंगलटन है - क्या एक समय में एक से अधिक उपयोगकर्ता ट्रांज़ेक्शन खोलना संभव है?

किसी भी चर्चा के लिए बहुत धन्यवाद।

+0

क्या आपने ईजेबी पर विचार किया था? ईजेबी कंटेनर प्रबंधित लेनदेन का उपयोग करते हैं। इस तरह आपको लेनदेन के प्रबंधन के बारे में चिंता करने की आवश्यकता नहीं है (और यह आपकी सेवा विधियों को ट्राइक-कैच अव्यवस्था से मुक्त रखता है)। – BalusC

+0

मेरा कोड पैटर्न बर्न्स जेएसएफ 2 जैसी किताबों से सीखा जाता है। मुझे इस कोड पैटर्न को बहुत कुछ नहीं लगता है क्योंकि मैंने इसे सभी को एक सार डीएओ ऑब्जेक्ट तक सीमित रखने में कामयाब रहा है। मेरे सभी ठोस डीएओ उस वस्तु से विस्तारित होते हैं, इसलिए यह जंकी (यदि वह शब्द लागू होता है) इसका हिस्सा दृष्टि से काफी अधिक है। लेकिन दिमाग से बाहर नहीं। – AlanObject

उत्तर

11
  1. क्योंकि UserTransaction जावा लेनदेन एपीआई (JTA) का हिस्सा है और EntityManager जावा हठ एपीआई (जेपीए) का हिस्सा है। जेटीए जेपीए का हिस्सा नहीं है। जेपीए जेटीए द्वारा प्रदान की जाने वाली सेवाओं का उपयोग करता है।

  2. प्रबंधित नहीं हैप्रॉपर्टी कुछ एनोटेशन है जो केवल @ManagedBean के साथ एनोटेटेड कक्षाओं में मान्य है। शायद इसे प्रबंधित बीन्स में उपयोगकर्ता ट्रांज़ेक्शन अलग-अलग तरीके से इंजेक्ट करने के लिए बेहतर माना गया था।

  3. सक्रिय लेनदेन के लिए जेएनडीआई लुकअप। आरक्षित नाम जावा लगता है: comp/userTransaction। एक कार्यान्वयन: http://www.java2s.com/Open-Source/Java-Document/Database-ORM/hibernate/org/hibernate/transaction/JTATransactionFactory.java.htm

  4. यह किसी प्रकार का सिंगलटन नहीं है, तो आप एक से अधिक हो सकते हैं। लेकिन केवल एक धागा सक्रिय हो सकता है।