2015-10-14 2 views
5

Я использую 2 источника данных Weblogic; В моих XML-конфигурациях у меня есть 2 единицы сохранения, 2 entityManagerFactories и 2 оператора транзакций. Файлы являются следующие:Определяющий компонент типа [org.springframework.transaction.PlatformTransactionManager] определен

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. Я также не использую спящий режим, который также упоминается в нескольких примерах. Ваше понимание очень ценится.

Я получаю следующее сообщение об ошибке:

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 правильно, в настоящее время ваша конфигурация неверна, это также то, что вам сообщает документация. Он не имеет ничего общего с спящим режимом или нет, это вопрос настройки Spring Data JPA правильно, он должен знать, какой entity manger и диспетчер транзакций использовать для каких репозиториев. Кроме того, использование 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" /> 

Потому что это идентификаторы ваших бобов.

Если вы хотите несколько источник данных я предлагаю прочитать: http://www.baeldung.com/spring-data-jpa-multiple-databases

+1

В этом примере вы используете абстракцию ORM JPA Spring. Там нет ни одного спящего JAR. да, он использует спящий режим под капотом, но вы можете изменить его на все, что захотите. Также в этом руководстве показано, как достичь двух источников данных весной JPA. –

+1

Не сосредотачивайтесь на факте спящего режима (что не имеет значения) важная часть состоит в том, что он показывает вам (что вы игнорируете), как правильно настроить Spring Data JPA ** для нескольких 'EntityManagerFactory' и' TransactionManager's **. –

+0

Обновление: Спасибо за помощь, ребята, я действительно новичок в этой концепции. @ M.Deinum Я добавил операторы 2 в application-context.xml и использовал этот пример и заменил hibernate для Eclipse Link, но пока не повезло. – Jay113

0

В настоящее время Дали поддерживает только одну единицу сохранения и один Постоянство XML файл для каждого проекта. Другие конфигурации могут существовать в проекте JPA, но проверка и обработка по умолчанию могут быть неверными при использовании нескольких единиц измерения продолжительности. Дополнительная информация here.

Смежные вопросы