org.springframework.beans.factory.NoSuchBeanDefinitionException:没有定义名为'transactionManager'的bean @Spring + JPA

时间:2015-05-21 10:09:09

标签: java spring hibernate spring-data-jpa

以下是我的applicationContext.xml

<bean
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    id="entityManagerFactory2">
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.m3.xml" />
    <property name="persistenceUnitName" value="M3tables" />
    <property name="packagesToScan" value="com.foo.webapp.integration.model.m3" />
</bean>

<bean
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    id="entityManagerFactory1">
    <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
    <property name="persistenceUnitName" value="webApp-integration" />
    <property name="packagesToScan" value="com.foo.webapp.integration.model.test" />
</bean>
<!-- ##################################### -->

<!-- Transaction Manager -->
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager1">
    <property name="entityManagerFactory" ref="entityManagerFactory1" />
</bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager2">
    <property name="entityManagerFactory" ref="entityManagerFactory2" />
</bean>
<tx:annotation-driven mode="aspectj"
    transaction-manager="transactionManager1" />
<tx:annotation-driven mode="aspectj"
    transaction-manager="transactionManager2" />

<jpa:repositories base-package="com.foo.webapp.test.repository"
    entity-manager-factory-ref="entityManagerFactory1" />

<jpa:repositories base-package="com.foo.webapp.repository"
    entity-manager-factory-ref="entityManagerFactory2" />

在我的服务文件中,我以两种方式添加了事务管理器

1。通过在课程级别添加

@Service
@Transactional(value="transactionManager2")
public class MitmasServiceImpl implements MitmasService {
    @Override
    public List<Mitmas> getAllItem() 
    {
        return mitmasRepository.findAll();

    }
}
  1. 通过在方法级别添加事务

    @Service
    public class MitmasServiceImpl implements MitmasService 
    {
        @Override
        @Transactional(value="transactionManager2")
        public List<Mitmas> getAllItem() 
        {
            return mitmasRepository.findAll();
    
        }
    }
    
  2. 我的完整服务文件位于

    之下
    @Service
    @Transactional(value="transactionManager2")
    public class MitmasServiceImpl implements MitmasService {
    
        @Autowired
        private MitmasRepository mitmasRepository ;
    
        @Override
        @Transactional(value="transactionManager2")
        public Mitmas createItem(Mitmas Mitmas) 
        {
            return mitmasRepository.save(Mitmas);
        }
    
        @Override
        @Transactional(value="transactionManager2",rollbackFor=ItemNotFound.class)
        public Mitmas deleteItem(String itemNo) throws ItemNotFound 
        {
            Mitmas deleteItem = mitmasRepository.findOne(itemNo);
            if(deleteItem == null)
            {
                throw new ItemNotFound();
            }
            else
            {
                mitmasRepository.delete(itemNo);
            }
            return deleteItem;
        }
    
        @Override
        @Transactional(value="transactionManager2",rollbackFor=ItemNotFound.class)
        public Mitmas updateItem(Mitmas Mitmas) throws ItemNotFound 
        {   
            Mitmas updateItem = mitmasRepository.findOne(Mitmas.getMmitno());
    
            if(updateItem==null)
            {
                throw new ItemNotFound() ;
            }
    
            updateItem.setMmitds(Mitmas.getMmitds());
            updateItem.setMmfuds(Mitmas.getMmfuds());
    
            return updateItem;
        }
    
    
        @Override
        @Transactional(value="transactionManager2")
        public List<Mitmas> getAllItem() 
        {
            return mitmasRepository.findAll();
    
        }
    
    
    }
    

    但我收到了以下错误

    org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'transactionManager' is defined
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:694)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1157)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:280)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:347)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:257)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodIntercceptor.invoke(CrudMethodMetadataPostProcessor.java:122)
        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.$Proxy51.findAll(Unknown Source)
        at com.leanswift.webapp.services.impl.MitmasServiceImpl.getAllItem(MitmasServiceImpl.java:68)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:267)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at com.sun.proxy.$Proxy53.getAllItem(Unknown Source)
        at com.leanswift.webApp.ui.serviceImpl.DataServiceImpl.returnBeans(DataServiceImpl.java:21)
        at com.leanswift.webApp.ui.presenter.BrowseViewPresenterImpl.returnBeans(BrowseViewPresenterImpl.java:64)
        at com.leanswift.webApp.ui.presenter.BrowseViewPresenterImpl.setBrowseView(BrowseViewPresenterImpl.java:56)
        at com.leanswift.webApp.ui.presenter.LoginPresenter.Login(LoginPresenter.java:46)
        at com.leanswift.webApp.ui.viewImpl.LoginViewImpl$1.buttonClick(LoginViewImpl.java:84)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
    

    任何人都可以帮我解决这个问题

1 个答案:

答案 0 :(得分:4)

如前所述,您正在使用Spring Data JPA和多个EntityManagerFactory bean。您需要告诉Spring Data JPA EntityManagerFactoryPlatformTransactionManager用于该特定配置。如果您未指定,则尝试使用默认transactionManager。这在Spring Data JPA参考指南中解释为here

  

请注意,如果未定义明确的PlatformTransactionManager,我们需要一个名为transactionManager的{​​{1}} bean。

您的配置

transaction-manager-ref

您只指定了<jpa:repositories base-package="com.foo.webapp.test.repository" entity-manager-factory-ref="entityManagerFactory1" /> <jpa:repositories base-package="com.foo.webapp.repository" entity-manager-factory-ref="entityManagerFactory2" /> 而不是entity-manager-factory-ref,因此它会尝试找到名为transaction-manager-ref的{​​{1}}。

要修复,请在元素中添加相应的PlatformTransactionManager

transactionManager