2015-10-14 55 views
5

我正在使用2个Weblogic数据源;在我的XML配置中,我有2个持久性单元,2个entityManagerFactories和2个transactionManagers。该文件如下:没有定义[org.springframework.transaction.PlatformTransactionManager]类型的限定bean

的persistence.xml

<persistence-unit name="modelPersistence" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
</persistence-unit> 

<persistence-unit name="orderPersistence" transaction-type="RESOURCE_LOCAL"> 
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
</persistence-unit> 

config.xml中

<!-- transactionManagers --> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

    <bean id="transactionManagerLegacy" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactoryLegacy" /> 
    </bean> 

<!-- entityManagerFactory --> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSourceModel"/> 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
     <property name="persistenceUnitName" value="modelPersistence" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="eclipselink.logging.level">FINE</prop> 
      </props> 
     </property> 
     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
       <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" /> 
       <property name="generateDdl" value="true"/> 
       <property name="showSql" value="true"/> 
      </bean> 
     </property> 
    </bean>  

<!-- entityManagerFactoryLegacy --> 
     <bean id="entityManagerFactoryLegacy" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSourceOrder"/> 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
     <property name="persistenceUnitName" value="orderPersistence" /> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="eclipselink.logging.level">FINE</prop> 
      </props> 
     </property> 
     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
       <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" /> 
       <property name="generateDdl" value="true"/> 
       <property name="showSql" value="true"/> 
      </bean> 
     </property> 
    </bean> 

<!-- data source 1--> 
    <bean id="dataSourceModel" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="model-datasource-jndi"> 
     <property name="jndiName" ref="model-datasource-jndi" /> 
     <property name="resourceRef" value="true" /> 
    </bean> 

<!-- data source 2--> 
    <bean id="dataSourceOrder" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="order-datasource-jndi"> 
     <property name="jndiName" ref="order-datasource-jndi" /> 
     <property name="resourceRef" value="true" /> 
    </bean> 

<!-- configure persistenceUnitManager --> 
    <bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
     <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" /> 
     <property name="dataSources"> 
     <map> 
      <entry key="jdbc/MODEL-DS" value-ref="dataSourceModel"/> 
      <entry key="jdbc/ORDER-DS" value-ref="dataSourceOrder"/> 
     </map> 
     </property> 
    </bean> 
    <jpa:repositories base-package="org.codingpedia.demo.repositories.ModelRepository" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/> 
    <jpa:repositories base-package="org.codingpedia.demo.repositories.OrderRepository" entity-manager-factory-ref="entityManagerFactoryLegacy" transaction-manager-ref="transactionManagerLegacy"/> 

ModelRepository

@Repository ("ModelRepo") 
@PersistenceContext(unitName = "modelPersistence") 
public interface ModelRepository extends JpaRepository<Model, String> {} 

orderRepository

@Repository ("OrderRepo") 
@PersistenceContext(unitName = "orderPersistence") 
public interface OrderRepository extends JpaRepository<Model, String> {} 

上正确标注处理多个事务管理有什么建议?我错过了别的吗?其他堆栈溢出示例使用的DAO,我没有找到有用的,因为我正在使用存储库,模型和控制器的Java文件。我也没有使用hibernate,很多例子都参考了。感谢您的见解。

我收到以下错误:

org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [org.springframework.transaction.PlatformTransactionManager] is defined: expected single matching bean but found 2: transactionManagerLegacy,transactionManager 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:365) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.determineTransactionManager(TransactionAspectSupport.java:370) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:271) 
    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.$Proxy120.findAll(Unknown Source) 
    at org.codingpedia.demo.controller.BaseController.index(BaseController.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:777) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:706) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:844) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280) 
    at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254) 
    at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:346) 
    at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3432) 
    at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402) 
    at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) 
    at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120) 
    at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) 
    at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2285) 
    at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2201) 
    at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2179) 
    at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1572) 
    at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:311) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:263) 
+0

您正在使用Spring Data JPA我建议您阅读文档。请参阅http://docs.spring.io/spring-data/jpa/docs/1.9.0.RELEASE/reference/html/#_custom_namespace_attributes。您需要为每个不同的存储库提供多个''元素,每个元素绑定到正确的entitymanagerfactory和事务管理器。目前基本上你做的是错的。 –

+0

你需要正确地配置spring-data-jpa,目前你的配置是错误的,这也是文档告诉你的。它与hibernate无关,或者它不是正确配置Spring Data JPA的问题,它需要知道哪个实体管理器和事务管理器用于哪个存储库。还有2个元素不起作用,你只能有一个,或者至少只有一个(定义的最后一个)会有用。 –

+0

您必须有另一个存储库元素或'@ EnableJpaRepositories'在某个使用默认值的地方或尝试这样做。可能在由“DispatcherServlet”加载的配置中。 –

回答

5

您可以使用:

@Transactional("transactionManagerName") 

见org.springframework.transaction.annotation.Transactional(@Transactional)的javadoc注释:

/** 
* A qualifier value for the specified transaction. 
* <p>May be used to determine the target transaction manager, 
* matching the qualifier value (or the bean name) of a specific 
* {@link org.springframework.transaction.PlatformTransactionManager} 
* bean definition. 
*/ 
String value() default ""; 
+0

我尝试了这个注释,但不幸的是仍然得到了同样的错误。 – Jay113

+1

因此,请尝试为所有回购配置事务管理器(以查看是否有帮助): rgrebski

+0

你知道任何额外的资源? – Jay113

0

你的情况应该是:

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

因为这是你的bean的ID。

如果需要多个数据源,我建议阅读本:http://www.baeldung.com/spring-data-jpa-multiple-databases

+1

在这个例子中你使用了Spring的ORM JPA抽象。没有人涉及到Hibernate JAR。是的,它在引擎盖下使用了休眠模式,但是可以将其更改为任何你想要的。另外本教程还演示了如何在Spring中实现两个数据源JPA –

+1

不要关注hibernate的事实(这是无关紧要的),重要的部分是它向您展示了(您忽略的)如何正确配置Spring Data JPA ** 'EntityManagerFactory's和'TransactionManager's **。 –

+0

更新:谢谢你们的帮助,我对这个概念真的很陌生。 @ M.Deinum我在application-context.xml中添加了2 语句,并使用该示例并将hibernate替换为Eclipse Link,但仍然没有运气。 – Jay113

0

目前大理只支持一个持久性单元和每个项目一个持久的XML文件。 JPA项目中可以存在其他配置,但在使用多个持久性单元时验证和默认处理可能不正确。查看更多信息here

相关问题