2012-01-19 22 views
7

के बजाय वसंत फेंक दिया JpaSystemException मैं DataAccessException हैंडलिंग के साथ परेशानी में हूं।डुप्लिकेटकेएक्सएक्सप्शन

जब एक विशिष्ट कुंजी बाधा का उल्लंघन किया जाता है तो मुझे एक जेपी सिस्टम सिस्टम प्राप्त होता है, न कि डुप्लिकेटकी अपवाद!

मुझे कुछ समस्या इस समस्या के बारे में बात कर रही है, लेकिन कोई भी समस्या को हल करने में मेरी सहायता नहीं करता है। मैं एक ठोस org.springframework.dao अपवाद कैसे मैप कर सकता हूँ?

मेरे इस तरह persistence.xml फ़ाइल देखो:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider>   
     <class>...</class> 
     <class>...</class> 
     ... 
     <exclude-unlisted-classes /> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
      <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/> 
      <property name="hibernate.connection.charSet" value="UTF-8"/> 
      <property name="hibernate.show.sql" value="true"/> 

      <property name="hibernate.ejb.event.post-insert" value="org.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" /> 
     <property name="hibernate.ejb.event.post-update" value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" /> 
     <property name="hibernate.ejb.event.post-delete" value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" /> 
     <property name="hibernate.ejb.event.pre-collection-update" value="org.hibernate.envers.event.AuditEventListener" /> 
      <property name="hibernate.ejb.event.pre-collection-remove" value="org.hibernate.envers.event.AuditEventListener" /> 
     <property name="hibernate.ejb.event.post-collection-recreate" value="org.hibernate.envers.event.AuditEventListener" /> 
    </properties>   
    </persistence-unit>  
    <persistence-unit name="persistenceUnitI24" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <class>...</class> 
     <class>...</class> 
     <exclude-unlisted-classes /> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="validate"/> 
      <property name="hibernate.connection.charSet" value="UTF-8"/> 
      <property name="hibernate.showsql" value="true"/>   
     </properties> 
    </persistence-unit> 
</persistence> 

और MySQL लेन-देन के बारे में प्रबंधक विन्यास:

<bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
      p:dataSource-ref="dataSource" 
      p:persistenceUnitName="persistenceUnit" 
      p:jpaProperties=""> 
      <property name="jpaVendorAdapter"> 
     <bean 
      class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true" /> 
       <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
       <property name="database" value="MYSQL"/>   
     </bean> 
     </property> 
      <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
      </property> 
    </bean> 

    <bean id="transactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager" 
      p:entityManagerFactory-ref="entityManagerFactory"/> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

मैं sqlserver के बारे में विन्यास हटा दिया है क्योंकि मुझे लगता है कि प्रासंगिक नहीं है । मुझे इस डीबी के बारे में अनुवाद त्रुटि में रूचि नहीं है।

मैं भी सेम शामिल किया है:

@Test(expected=DuplicateKeyException.class) 
public void createNewUbi(){ 
    Ubi ubi = new Ubi(); 
    ubi.setCode("A"); 
    ubiDao.save(ubi);  

    ubi = new Ubi(); 
    ubi.setCode("A"); 

    ubiDao.save(ubi);     
} 

मैं अपने लॉग से मिला:

ERROR: org.hibernate.util.JDBCExceptionReporter - Duplicate entry 'A' for key 'code' 

पकड़ने

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

निम्नलिखित सरल JUnit परीक्षण करना की कोशिश दूसरे सेव कॉल के अपवाद में मैंने देखा कि मेरे पास है:

JpaSystemException: cause: javax.persistence.PersistenceException 
PersistenceException: cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException 

अगर मैं webapp से एक प्रविष्टि करने के लिए मैं इस अपवाद मिल की कोशिश:

org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:311) 
    org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect.ajc$afterThrowing$org_springframework_orm_jpa_aspectj_JpaExceptionTranslatorAspect$1$18a1ac9(JpaExceptionTranslatorAspect.aj:15) 
    it.cpmapave.pm.dao.jpa.GenericDaoJpa.save(GenericDaoJpa.java:29) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    $Proxy56.save(Unknown Source) 
    it.cpmapave.pm.service.amministrazione.SettoreServiceImpl.saveSettore(SettoreServiceImpl.java:34) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    $Proxy57.saveSettore(Unknown Source) 
    it.cpmapave.pm.controller.amministrazione.SettoreController.create(SettoreController.java:42) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    java.lang.reflect.Method.invoke(Method.java:597) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:369) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:177) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    com.springsource.insight.collection.tcserver.request.HttpRequestOperationCollectionValve.invoke(HttpRequestOperationCollectionValve.java:84) 
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:279) 
    org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 
    java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    java.lang.Thread.run(Thread.java:662) 

मैं mysql क्वेरी लॉगिंग सक्षम की है और मैं निम्न क्वेरी मिल गया:

insert into ubi (code, version) values ('A', 0) 

मैं तो MySQL कंसोल से क्वेरी निष्पादित करने का प्रयास करें: ERROR 1062 (23000): Duplicate entry 'A' for key 'code'

पैकेज में sql-error-codes.xml में खोज के 10 मैंने पाया कि त्रुटि कोड 1062 db mysql के लिए इस तरह से कॉन्फ़िगर किया गया है: गलत कॉन्फ़िगर गुणों के कारण

<property name="duplicateKeyCodes"> 
    <value>1062</value> 
</property> 

तो मुझे लगता है कि कुछ अपवाद अनुवाद समस्या यह है कि .. लेकिन जो?

मैं वसंत 3.0.6.RELEASE और हाइबरनेट 3.6.9.FINAL उपयोग कर रहा हूँ

किसी भी उत्तर के लिए धन्यवाद! मार्को

+0

@skaffman ठीक देने के लिए शुरू कर दिया है, यह UncategorizedDataAccessException का एक उपवर्ग है और फिर DataAccessException की। क्या आप जानते हैं कि मैं एक वर्गीकृत अपवाद को कैसे मैप कर सकता हूं, जैसे कि मेरे मामले में डुप्लिकेटकीएक्सप्शन? धन्यवाद! – gipinani

+0

@skaffman मैंने अपनी पोस्ट को अधिक जानकारी के साथ अपडेट किया है। – gipinani

+0

मैंने पाया है कि जब Maven परियोजना संकलन मैं इस चेतावनी मिलती है: सलाह org.springframework.orm.jpa.aspectj.JpaExceptionTranslatorAspect में परिभाषित किया गया लागू नहीं हुआ है यह एक कारण हो सकता है? :) – gipinani

उत्तर

3

यह समस्या वसंत या आपके डेटाबेस ड्राइवर से संबंधित नहीं है। मुझे थोड़ी देर पहले इस के माध्यम से काम करना पड़ा। मुझे यह जानकर आश्चर्य हुआ कि हाइबरनेट-एंटिनेमजर जार, जो आपको जेबरा प्रदाता के रूप में हाइबरनेट का उपयोग करने देता है, इसमें कुछ खराब अपवाद अनुवाद है।AbstractEntityManagerImpl.convert() विधि HibernateException एस को जेपीए PersistenceException एस में परिवर्तित करने के लिए ज़िम्मेदार है, लेकिन यह किसी भी प्रकार की "डुप्लिकेट कुंजी" या "अद्वितीय बाधा" अपवादों को संभाल नहीं पाती है। यहां तक ​​कि latest code on Github ने इसे ठीक नहीं किया है। यदि आप इसे देखते हैं, तो कनवर्ट() विधि में आईएफएस की लंबी श्रृंखला होती है, लेकिन उनमें से कोई भी उस विशेष प्रकार के अपवाद को कवर नहीं करता है, इसलिए यह नीचे तक गिर जाता है और इसे सामान्य PersistenceException में अनुवादित किया जाता है। यह बल्कि कष्टप्रद है।

4

सुनिश्चित करें कि आपके EntityManager पर vendorAdapter सेट है। यह आपके जेपीए प्रदाता को उन्नत त्रुटि कोड प्रदान करने की अनुमति देगा।

1

मेरे पास यह कॉन्फ़िगरेशन में सेट था।

transactionManager.setJpaDialect(new HibernateJpaDialect()); 

मैं इसे दूर टिप्पणी की है और अचानक अपने आवेदन DuplicateKeyException

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

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