我在我的代码中使用了两个事务管理器。一个被标记为主要的。完整的配置使用Spring注释。
我尝试使用NON-primary事务管理器进行更新的表不能将数据保存在数据库中。如果我将同一个事务管理器标记为主,那么它会开始将数据插入到数据库中。Spring JPA存储库不能与两个事务管理器一起工作
在非主事务的情况下,我得到以下错误
org.springframework.dao.InvalidDataAccessApiUsageException: no transaction is in progress; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:413)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:157)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:417)
at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:59)
at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:147)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:111)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
at com.sun.proxy.$Proxy39.flush(Unknown Source)
at com.ashish.business.CreditCardManagementImpl.addCreditCardUser(CreditCardManagementImpl.java:44)
at com.ashish.business.CreditCardManagementImpl.addCrCardCustomerData(CreditCardManagementImpl.java:30)
我的代码出现在以下位置 https://github.com/ashismo/repositoryForMyBlog/tree/master/spring/SpringJPARepoDistributedTransaction
在我的代码,com.ashish.appConfig包有三个类叫做AppConfig.java,CreditCardTransactionConfig.java和DebitCardTransactionConfig.java。凡的AppConfig包括了其他两个阶级,CreditCardTransactionConfig.java有非主事务管理器配置
我正在从JUnit的文件中的代码。并且上面提到的错误一旦我尝试做creditUserDetailRepository.flush();。如果我的代码中没有这行代码,那么我没有收到任何错误,但是数据没有被插入到表中。
有人可以帮我吗?
非常感谢Apokralipsa。它为我工作。也感谢您的建议。我将在我的github代码中执行相同的操作。 我想和你一起检查一下(如你方的注释中的第二点),即如果我没有使用任何限定符,那么我的存储库将如何知道要使用哪个事务管理器和实体管理器? –
您使用'@ EnableJpaRepositories'为位于特定包中的实体指定实体管理器工厂和事务管理器,它仍然可以这样工作。使用'@ Bean'注解的方法名称,该注释的name属性以及'@ Qualifier'注解的value属性在您的情况下具有相同的用途,因此您只需设置相同的名称三次。 – Apokralipsa