エンティティマネージャーを以下のように設定して、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を使用しています。
ありがとう
Transaction-manager属性のデフォルト値はtransaction-managerです。あなたの場合、次のように、メソッドまたはサービスごとに使用するトランザクションマネージャーを指定する必要があります。
@Service
@Transactional(value="LiveTransactionManager")
class someClass...
または
@Transactional(value="ArchiveTransactionManager")
public void someMethod
実際、そこには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>
私はJava構成を使用し、transactionManagerRefを指定することが解決策でした:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "myCustomEntityManagerFactory",
basePackages = {"ua.demitt.other.path.to.repos"},
transactionManagerRef = "myCustomTransactionManager" )
@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})