2012-10-18 15 views
6

में इकाई प्रबंधक या लेनदेन कैसे प्राप्त करें I सम्मिलित, हटाएं और अपडेट के दौरान कुछ संचालन करने के लिए PostDeleteEventListener, PostInsertEventListener, PostUpdateEventListener जैसे हाइबरनेट ईवेंट श्रोता का उपयोग कर रहा था। अब मैं ऐसा करने के लिए जेपीए श्रोता का उपयोग करना चाहता हूं क्योंकि अगर मैं किसी अन्य जेपीए प्रदाता को हाइबरनेट से स्थानांतरित करना चाहता हूं तो मेरे श्रोता को काम करना चाहिए। हाइबरनेट श्रोता मुझे event देता है जिससे मैं लेनदेन प्राप्त कर सकता हूं और जांच कर सकता हूं कि क्या यह प्रतिबद्ध है या रोलबैक है। जेपीए श्रोताओं केवल मुझे इकाई वस्तु प्रदान करता है। अब मैं जेपीए श्रोता में लेनदेन या सत्र या इकाई प्रबंधक कैसे प्राप्त कर सकता हूं ?? अग्रिम में धन्यवाद!! मैं अपने सीएमटी के रूप में जेबॉस का उपयोग कर रहा हूं।जेपीए श्रोता

उत्तर

6

यह जेपीए 2.0 के रूप में समर्थित नहीं है।

जेपीए 2.1 (जावा ईई 7 में होने के लिए स्लेटेड) में, निरंतरता प्रदाता एक प्रबंधित वातावरण (जैसे जेबॉस ऐप सर्वर) में सीडीआई बीन्स के रूप में इकाई श्रोताओं के रूप में व्यवहार करेगा। Proposed Final Draft of the JPA 2.1 spec से, पृष्ठ 96:

जावा ईई में इकाई श्रोता कक्षाएं संदर्भ और निर्भरता इंजेक्शन एपीआई (CDI) [10] के माध्यम से समर्थन निर्भरता इंजेक्शन वातावरण जब युक्त संग्रह एक सेम संग्रह है। एक इकाई श्रोता कक्षा जो सीडीआई इंजेक्शन का उपयोग करती है, जीवन चक्र पोस्टकॉन्स्ट्रक्ट और प्रीडेस्ट्रा एनोटेशन के साथ एनोटेटेड कॉलबैक विधियों को भी परिभाषित कर सकती है। इन विधियों इंजेक्शन के बाद सक्रिय किया जाएगा हुआ है और इकाई श्रोता उदाहरण से पहले नष्ट हो जाता है क्रमशः

तो जेपीए 2.1 में, आप एक CDI निर्माता EntityManager प्रावधान है कि अगर बनाने (बस के साथ एक @PersistenceContext क्षेत्र व्याख्या द्वारा @Produces), आप केवल श्रोता में EntityManager इंजेक्ट कर सकते हैं।

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

ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext(); 
auditLogService = (AuditLogService) ctx.getBean("auditLogService"); 

यह मेरे लिए अच्छी तरह से काम करता है:

-1

आप सभी पूर्व/पोस्ट लोड, सम्मिलित करें, अद्यतन का उपयोग करें या दो तरीके का उपयोग करके जेपीए में श्रोता हटा सकते हैं:

  1. एनोटेशन का उपयोग करके। एक श्रोता का उपयोग कर किया जा सकता है जहां एक इकाई एक क्षणिक चर के बाद इकाई, कायम कर दिया गया है अद्यतन या, लोड की तरह आबादी होने की जरूरत है कि है की एक सरल उदाहरण:

    public class AvailableCreditListener { 
        @PostLoad 
        @PostPersist 
        @PostUpdate 
        public void calculateAvailableCredit(Account account) { 
         account.setAvailableCredit(
          account.getBalance().add(
          account.getOverdraftLimit())); 
        } 
    } 
    

    इकाई वर्ग के साथ @ एनोटेट किया जाएगा EntityListeners:

    @EntityListeners({AvailableCreditListener.class}) 
    public class Account extends BaseEntity { 
        private BigDecimal balance; 
        private BigDecimal overdraftLimit; 
        @Transient 
        private BigDecimal availableCredit; 
        // getters and setters 
    } 
    
  2. persistence.xml विन्यास फाइल का उपयोग करके।

अंत में, एनोटेशन के बजाय, एक XML मैपिंग फ़ाइल के लिए इस्तेमाल किया जा सकता है और तैनात आवेदन के साथ डिफ़ॉल्ट श्रोताओं निर्दिष्ट करने के लिए। (यह मैपिंग फ़ाइल persistence.xml फ़ाइल द्वारा संदर्भित है।) लेकिन एक इकाई @ExcludeDefaultListeners एनोटेशन का उपयोग कर सकती है अगर वह डिफ़ॉल्ट श्रोताओं का उपयोग नहीं करना चाहती है।

@ExcludeDefaultListeners 
@Entity 
public class Account extends BaseEntity { 
    .... 
} 

अपने persistence.xml में:

<persistence-unit-metadata> 
    <persistence-unit-defaults> 
     <entity-listeners> 
     <entity-listener class="samples.AvailableCreditListener"/>  
     </entity-listeners> 
    </persistence-unit-defaults> 
    </persistence-unit-metadata> 
+6

मेरा सवाल यह है कि उपलब्ध क्रेडिट प्राप्तकर्ता वर्ग में इकाई प्रबंधक कैसे प्राप्त करें – Muzy

1

मेरे मामले में मैं इस कोड का उपयोग कर रहा हूँ।

इस आवेदन के कोड https://bitbucket.org/macielbombonato/apolo

मुझे आशा है कि यह मदद कर सकता है पर डाउनलोड करने के लिए उपलब्ध है।

+0

इसे "उत्तर" के रूप में जाना जाना चाहिए, लेकिन स्पष्ट उत्तर (सामान्य मामले के लिए) होगा, इकाई प्रबंधक को जेएनडीआई लुकअप के माध्यम से प्राप्त करें, लेकिन विशिष्ट बाध्यकारी उपयोग कंटेनर विशिष्ट होगा (जेबॉस, ग्लासफ़िश, वेबलॉगिक, आदि) – him