java - DB constraint violation not throwing Exception in Hibernate -
मेरे पास निम्न कोड है:
try {userDAO1.save (userrecord); userDAO2.save (userRecord); } पकड़ (DataIntegrityViolationException ई) {नई ApplicationException ( "contraint का उल्लंघन")} फेंक userDAO1.save (userRecord) का उल्लंघन एक अखंडता बाधा - तो बाद पूरे कोड चलाया जा रहा है, वहाँ है तालिका userDAO1 को कुछ भी नहीं लिखा है
हालांकि, userDAO1.save () कथन त्रुटि / अपवाद नहीं डालता है - इसलिए userDAO2.save () को भी निष्पादित किया जाता है।
लेकिन डेटाइन्टेग्रीटी उल्लंघन उल्लंघन अपनाना है, और स्टैक ट्रेस रिक्त है। मैं कैसे जांच करूं कि डेटाइन्टेग्रीटी उल्लंघन का अपवाद कहाँ से निकाल दिया गया है, और userDAO2.save () को निष्पादित होने से रोकने के लिए अगर userDAO1.save () एक बाधा का उल्लंघन करता है ?
मैंने इस कोड के आसपास एक ट्रांस्ैक्शनल एनोटेशन जोड़ने की कोशिश की, लेकिन वह भी काम नहीं कर पाई।
स्टैक ट्रेस:
org.springframework .dao.DataIntegrityViolationException: ORA-00001: अद्वितीय बाध्यता (UNIQUE_EMAIL) का उल्लंघन; एसक्यूएल [एन / ए]; बाधा [UNIQUE_EMAIL]; नेस्टेड अपवाद org.hibernate.exception.ConstraintViolationException: ORA-00001: अद्वितीय बाधा (UNIQUE_EMAIL) org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException (SessionFactoryUtils.java:643) पर org.springframework.orm.jpa.vendor पर उल्लंघन किया है .HibernateJpaDialect.translateExceptionIfPossible (org.springframework.orm.jpa.JpaTransactionManager.doCommit (JpaTransactionManager.java )16) पर org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit (AbstractPlatformTransactionManager.java:754) पर org.springframework.orm.jpa.ApplicationExceptionIfPossible (HibernateJpaDialect.java:104) पर Org.springframework.transaction.support.AbstractPlatformTransactionManager.commit (AbstractPlatformTransactionManager.java:723) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning (TransactionAspectSupport.java:393) org.springframework.transaction.interceptor.TransactionInterceptor.invoke पर () Org.springframework.aop पर लेन-देन इंटरसेप्टर.जावाईआर 20) .framework.ReflectiveMethodInvocation.proceed org.springframework.aop.framework.JdkDynamicAopProxy.invoke पर (ReflectiveMethodInvocation.java:172) (JdkDynamicAopProxy.java:202) com पर com.sun.proxy। $ Proxy76.updateUser (अज्ञात स्रोत) में। osiris.UserReg.UpdateUserCommand.execute (UpdateUserCommand.java:63) कोड मैं पोस्ट किया है UpdateUserCommand, जो @Transactional साथ टिप्पणी की जाती है में है (rollbackFor = Exception.class , प्रचार = प्रचार। REQUIRES_NEW)
ठीक है, यह एक मुश्किल का एक सा है , लेकिन मैं अपनी पूरी कोशिश करूंगा हाइबरनेट केवल ट्रांजैक्शन कब लेगा, जब ट्रांन्सैक्निकल एक्सट्स के साथ एनोटेट की गई विधि इसलिए आपके डेटाइन्टेग्रीटी उल्लंघन का अपवाद केवल उस पद्धति रिटर्न के बाद ही पकड़ा जा सकता है। ऐसा कोई तरीका नहीं है कि आप हाइबरनेट को UserDAO2.save () कॉल नहीं कर सकते क्योंकि यह पता नहीं लगा सकता कि उल्लंघन हुआ है। मैं नीचे एक उदाहरण प्रदान करूँगा @Service / * इन चर नामों को स्पष्टता के लिए उपयोग किया जाता है, मैं वास्तव में इन नामों का उपयोग नहीं करता हूं * / सार्वजनिक UserServiceImpl लागू करता है UserService {@Autowired Private HibernateUserDAO1 userDao1; @ अटूट निजी हाइबरनेट यूज़र डीओ 2 उपयोगकर्ताडाओ 2 @ ट्रान्सैक्शनल / * इस पद्धति को कहां बुलाया जाता है, इसके बारे में अपना प्रयास करें पकड़ो * / सार्वजनिक वायर्डउपयोगकर्ताडाओ 1 (उपयोगकर्ता उपयोगकर्ता) {userDao1.saveOrUpdate (उपयोगकर्ता); } @Transactional / * केवल इस फोन करता है, तो saveUserDao1 सफल होता है * / सार्वजनिक शून्य saveUserDao2 (उपयोगकर्ता उपयोगकर्ता) {userDao2.saveOrUpdate (उपयोगकर्ता)}} फिर अपने HibernateUserDAO1 में: < Pre> सार्वजनिक शून्य सेव ऑरअपडेट (उपयोगकर्ता उपयोगकर्ता) {currentSession ()। SaveOrUpdate (उपयोगकर्ता); } अपवाद केवल आपकी सेवा परत से ऊपर पकड़ा जा सकता है। आदर्श रूप से आप जो करना चाहते हैं, वह व्यक्ति 2 अलग डीएओ के प्रयोग से बचाता है और यह जांचता है कि पहला कार्य करने से पहले सफलता मिली।
संपादित करें: यह भी ध्यान रखें कि सीतनिद्रा में होना ट्रान्सैक्शन के साथ एनोटेट निजी विधियों को नहीं उठाएगा क्योंकि सीतनिद्रा में होना आपके इंटरफ़ेस से प्रॉक्सी ऑब्जेक्ट बनाने पर निर्भर करता है। कोई इंटरफ़ेस परिभाषा नहीं = कोई प्रॉक्सी ऑब्जेक्ट नहीं = हाइबरनेट सत्र। इसलिए आप @ ट्रांन्सैक्शन के साथ एनोटेट की गई एक निजी विधि को कॉल नहीं कर सकते मैं एक सार सुपरक्लॉस में अपने सत्र फाइल को एक ऑब्जेक्ट बनाने की कोशिश करूँगा और दोनों ही डीएओ के इस से मिले हैं। एक बेहतर विकल्प 2 लेनदेन प्रबंधकों का उपयोग करना है जो आपके विभिन्न डेटाबेस के लिए इंगित करता है, फिर निर्दिष्ट करें कि कौन सी डेटाबेस चीजें भी बचत कर रही हैं इस तरह से आप केवल 1 डीएओ का उपयोग कर सकते हैं और जो भी सत्र फ़ैक्टरी का उपयोग कर सकते हैं वह आपको बचाता है।
Comments
Post a Comment