web-dev-qa-db-ja.com

'transactionManager'という名前のBeanは定義されていません

エンティティマネージャーを以下のように設定して、2つの永続的なユニットを構成しました。

<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」と呼ばれていました。追加の永続ユニットを追加すると、エラーが発生するようです。わからないことが1つあります。2つの永続的なユニット(それぞれが個別のデータベース用)を構成した場合、データソースごとに個別のエンティティマネージャーとトランザクションマネージャーも構成する必要がありますか?

私が得るエラーは以下に示されています:(私はすべてのファイルを検索しましたが、 "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でSpringを使用しています。

ありがとう

26
ziggy

Transaction-manager属性のデフォルト値はtransaction-managerです。あなたの場合、次のように、メソッドまたはサービスごとに使用するトランザクションマネージャーを指定する必要があります。

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

または

@Transactional(value="ArchiveTransactionManager") 
public void someMethod
26
sebi

実際、そこにはis Spring Data JPAで名前付きTransactionManagerを使用する方法があります。これは私にとってはうまくいきます:

<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>
8
Jan Petersen

私はJava構成を使用し、transactionManagerRefを指定することが解決策でした:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
    entityManagerFactoryRef = "myCustomEntityManagerFactory",
    basePackages = {"ua.demitt.other.path.to.repos"},
    transactionManagerRef = "myCustomTransactionManager" )
1
Demitt

@Configurationファイルで、これがdataSourceの場合:

@Bean(name = "dataSource")
public DataSource getDataSource() {
    return DataSourceBuilder
            .create()
            .username(username)
            .password(password)
            .url(url)
            .build();
}

これはトランザクションマネージャーBeanになります。

@Bean(name = "DataSourceTransactionManager")
public DataSourceTransactionManager getDataSourceTransactionManager() {
    return new DataSourceTransactionManager(getDataSource());
}

次に、トランザクションにしたいサービスメソッドに注釈を付けます。

@Transactional(transactionManager = "DataSourceTransactionManager", timeout = 60, rollbackFor = { Exception.class})
0
Shahriar