2015-10-14 59 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

相關問題