2012-05-23 37 views
21

我已經配置了兩個持久單位與實體管理器設置,如下所示:沒有名爲「transactionManager的」豆定義

<bean id="liveEntityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
      p:dataSource-ref="LiveDataSource">   

      <property name="persistenceUnitName" value="LivePersistenceUnit" /> 
    </bean> 

    <bean id="archiveEntityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
      p:dataSource-ref="ArchiveDataSource">   

      <property name="persistenceUnitName" value="ArchivePersistenceUnit" /> 
    </bean> 

我再配置的事務管理器作爲

<bean id="LiveTransactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager" 
      p:entityManagerFactory-ref="liveEntityManagerFactory"/> 

    <bean id="ArchiveTransactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager" 
      p:entityManagerFactory-ref="archiveEntityManagerFactory"/> 

我原本只配置了一個,它被稱爲「transactionManager」。添加一個額外的持久單元似乎會產生一個錯誤。 有一件事我不明白,如果我配置了兩個持久單元(每個單獨的數據庫)我也需要爲每個數據源配置一個單獨的實體管理器和事務管理器嗎?

,我得到的錯誤如下所示:(我有搜索所有的文件,我不能在任何地方找到那裏是「transactionManager的」參考)

org.springframework.ws.soap.client.SoapFaultClientException: No bean named 'transactionManager' is defined 
    at org.springframework.ws.soap.client.core.SoapFaultMessageResolver.resolveFault(SoapFaultMessageResolver.java:37) 
    at org.springframework.ws.client.core.WebServiceTemplate.handleFault(WebServiceTemplate.java:774) 
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:600) 
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:537) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:384) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:378) 
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:370) 
    at com.ws.client.SoapTest.testFail(SoapTest.java:140) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) 
    at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:220) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 

我使用使用JPA/Hibernate的春天。

謝謝

+0

你應該只使用一個TransactionManager,並且它的bean應該被命名爲「transactionManager」。 – Luciano

+0

事務管理器必須具有對EntityManagerFactoryBean的引用,如上所示。我如何配置它,如果我有兩個EntityManagerFactoryBean? (每個用於單獨的數據源) – ziggy

+2

如果僅使用一個EntityManager,則JPATransactionManager有效。如果使用多個數據源,則需要所有數據源之間的一致性,因此您需要使用org.springframework.transaction.jta.JtaTransactionManager。你熟悉JTA嗎? – Luciano

回答

25

事務管理器屬性的默認值是事務管理器。在你的情況,你應該指定要每個方法或服務使用這樣的事務管理器:

@Service 
@Transactional(value="LiveTransactionManager") 
class someClass... 

@Transactional(value="ArchiveTransactionManager") 
public void someMethod 
+5

這不適用於服務類本身。它必須是每個方法,否則你將得到相同的異常。但是,根據文檔:如果未找到特定的PlatformTransactionManager bean,則仍將使用默認的目標bean名稱transactionManager。 – 2012-08-14 19:33:08

8

其實,有的方式來使用命名事務管理與Spring數據JPA。這適用於我:

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

<jpa:repositories base-package="com.xxx.yyy" entity-manager-factory-ref="myEntityManagerFactory" transaction-manager-ref="myTransactionManager"> 
</jpa:repositories> 
相關問題