2012-08-31 19 views
10

में ऑटो अपडेट को अक्षम कैसे करें एक निरंतर ऑब्जेक्ट को ऑटो अपडेट करने से हाइबरनेट को रोकना संभव है?हाइबरनेट/जेपीए

@Transactional 
    public ResultTO updateRecord(RequestTO requestTO) { 

     Entity entity = dao.getEntityById(requestTO.getId()); 

     // now update the entity based on the data in the requestTO 

     ValidationResult validationResult = runValidation(entity); 

     if(validationResult.hasErrors()) { 
      // return ResultTO with validation errors 
     } else { 
      dao.persist(entity); 
     } 
    } 

यहाँ कोड में होता है, मैं इकाई जो हाइबरनेट द्वारा विचार किया जाएगा, लगातार स्थिति में हो तो मैं इकाई में से कुछ फ़ील्ड अद्यतन करने के लिए पुनः प्राप्त है, तो इकाई सत्यापन करने के लिए गुजरती हैं। अगर सत्यापन विफल रहता है, तो सत्यापन रद्द होने पर, उतार-चढ़ाव न करें, फिर इकाई को बनाए रखें।

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

ध्यान रखें कि मैं जिस तरह से सत्यापन करता हूं और इस मुद्दे के आसपास काम करता हूं, तो मुझे कामकाज में दिलचस्पी नहीं है। मुझे यह जानने में दिलचस्पी है कि मैं हाइबरनेट फीचर को कैसे अक्षम कर पाऊंगा जहां यह लगातार ऑब्जेक्ट्स को अपडेट करता है।

कृपया ध्यान रखें कि मैं जेपीए के हाइबरनेट्स के कार्यान्वयन का उपयोग कर रहा हूं। इसलिए हाइबरनेट विशिष्ट एपीआई से निपटने वाले विशिष्ट उत्तरों को हाइबरनेट मेरे लिए काम नहीं करेगा।

मैंने हाइबरनेट कॉन्फ़िगरेशन की तलाश करने की कोशिश की और देखें कि क्या मैं इस व्यवहार को रोकने के लिए कोई कॉन्फ़िगरेशन सेट कर सकता हूं लेकिन कोई किस्मत नहीं।

धन्यवाद

--EDIT --- मैं इस के लिए एक समाधान नहीं मिल सकता है, तो मैं किसी भी RuntimeException फेंकने के बिना लेनदेन वापस रोलिंग भले ही मैं एक कथात्मक लेन-देन का प्रयोग करने में कर रहा हूँ करने का विकल्प चुना:

लेनदेनइंटरसेप्टर.currentTransactionStatus()। SetRollbackOnly();

जो एक आकर्षण की तरह काम करता है।

उत्तर

0

अगर सत्यापन विफल रहता है और कॉलर संभालता है तो अपवाद फेंको।

+0

धन्यवाद, लेकिन जैसा कि मैंने कहा im एक समाधान की तलाश में नहीं, मैं पहले से ही है कि, im कि करने के लिए एक विशिष्ट विन्यास ऑटो अद्यतन करने diable कर सकते हैं की तलाश में है। – lutfijd

1

अपने सत्र के लिए फ्लशमोड कॉन्फ़िगर करें।

http://docs.jboss.org/hibernate/orm/3.5/api/org/hibernate/FlushMode.html

+0

यह हाइबरनेट विशिष्ट एपीआई है जो मुख्य रूप से संबंधित है कि प्रश्नों को निष्पादित करने से पहले हाइबरनेट कैसे कार्य करता है (फ्लश या नहीं, स्टेल डेटा से बचने के लिए)। जेपीए EntityManager फ्लश मोड सेट करने की अनुमति देता है लेकिन यह केवल क्वेरी प्रबंधन से संबंधित है। भले ही मैंने अभी भी EntityManager में फ्लश मोड को विभिन्न प्रकारों पर सेट करने का प्रयास किया है और फिर भी इससे कोई फर्क नहीं पड़ता है। – lutfijd

+0

@user आपकी टिप्पणी मुझे स्पष्ट नहीं है। ऊपर दिए गए लिंक में मैंने स्पष्ट रूप से सेट किया है "एक फ्लशिंग रणनीति का प्रतिनिधित्व करता है। फ्लश प्रक्रिया राज्य परिवर्तनों का पता लगाने और SQL कथन निष्पादित करके सत्र स्थिति के साथ डेटाबेस स्थिति को सिंक्रनाइज़ करती है।" देखें [लिंक] (http://stackoverflow.com/questions/3220336/whats-the-use-of- सत्र-flush-in-hibernate) –

+0

पहले: यह हाइबरनेट विशिष्ट API है और जेपीए एपीआई नहीं है। दूसरा: जेपीए फ्लश मोड सेटिंग्स व्यवहार को प्रभावित नहीं करती क्योंकि चूंकि जेपीए में 2 फ्लश मोड प्रकार प्रतिबद्ध हैं और ऑटो और मैन्युअल मोड नहीं है। तो मेरे प्रश्न पर वापस जेपीए में ऑटो अपडेट को अक्षम करने के लिए कैसे करें क्योंकि आपके द्वारा प्रदान किए गए लिंक जेपीए संदर्भ में ज्यादा मदद नहीं करेंगे। – lutfijd

0

आप नीचे दिए गए कोड को कॉल कर सकते हैं:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 

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

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