2012-05-23 21 views
21

を定義されていない私は、エンティティマネージャで2つの永続ユニットを構成している下のショーのように設定:が「トランザクションマネージャー」という名前のBeanが

<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"/> 

私のようにトランザクションマネージャを構成しただ1つが設定されていて、それは "transactionManager"と呼ばれていました。追加の永続ユニットを追加すると、エラーが発生するようです。 2つの永続ユニット(それぞれ別々のデータベース用)を設定すると、個々のエンティティマネージャと各データソース用のトランザクションマネージャを設定する必要があるのですか?私が手

エラーを以下に示します。(私はすべてのファイルを検索していると「トランザクションマネージャー」の参照がある場合、私はどこにも見つけるカント)

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

あなたはただ1つのTransactionManagerを使用し、そのbeanの名前は "transactionManager"でなければなりません。 – Luciano

+0

トランザクションマネージャは、上記のようにEntityManagerFactoryBeanへの参照を持っていなければなりません。私は2つのEntityManagerFactoryBeanを持っているとどうすれば設定できますか? (別々のデータソースの場合) – ziggy

+2

JPATransactionManagerは、EntityManagerを1つだけ使用している場合に機能します。複数を使用する場合は、すべてのデータソース間の一貫性が必要です。したがって、org.springframework.transaction.jta.JtaTransactionManagerを使用する必要があります。あなたはJTAに精通していますか? – Luciano

答えて

25

デフォルト値はtransaction-managerです。実際には、は春と名前のトランザクションマネージャーを使用する方法あり

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

または

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

これはサービスクラス自体では機能しません。メソッドごとにする必要があります。そうでなければ、同じ例外が発生します。ただし、ドキュメントごとに:特定の修飾されたPlatformTransactionManager Beanが見つからない場合、デフォルトのターゲットBean名transactionManagerは引き続き使用されます。 –

8

:あなたのケースでは、あなたがこのようにメソッドまたはサービスごとに使用したいトランザクションマネージャ指定する必要がありますデータ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> 
関連する問題