2012-05-23 8 views
21

ich zwei persistent Einheiten mit den Entity-Manager eingestellt, wie zeigen sich unten konfiguriert haben:Keine Bohne ‚transaction‘ genannt wird, definiert

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

ich konfiguriert dann die Transaktionsmanager als

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

ursprünglich I hatte nur eine konfiguriert und es hieß "transactionManager". Addint eine zusätzliche persistente Einheit scheint einen Fehler zu erzeugen. Eine Sache, die ich nicht verstehe, wenn ich zwei persistente Einheiten konfiguriert habe (jede für eine separate Datenbank) muss ich auch einen individuellen Entity Manager und einen Transaktionsmanager für jede Datenquelle konfigurieren?

Der Fehler, die ich bekommen ist wie folgt: (I suchen müssen alle Dateien und ich kann nicht überall finden, wo es eine Referenz für „transaction“ ist)

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) 

I Frühling bin mit mit JPA/Hibernate.

Dank

+0

Sie sollten nur einen TransactionManager verwenden, und seine Bean sollte "transactionManager" genannt werden. – Luciano

+0

Der Transaktionsmanager muss einen Verweis auf die EntityManagerFactoryBean haben, wie oben gezeigt. Wie würde ich es konfigurieren, wenn ich zwei EntityManagerFactoryBean habe? (Jede für eine separate Datenquelle) – ziggy

+2

JPATransactionManager funktioniert, wenn Sie nur einen EntityManager verwenden. Wenn Sie mehr als eins verwenden, benötigen Sie Konsistenz zwischen all Ihren Datenquellen. Daher müssen Sie auf org.springframework.transaction.jta.JtaTransactionManager zurückgreifen. Kennen Sie JTA? – Luciano

Antwort

25

Der Standardwert für die Transaktion-Manager Attribut ist transaktions Manager. In Ihrem Fall sollten Sie festlegen, welche Transaktionsmanager Sie pro Verfahren oder eine Dienstleistung wie diese verwenden möchten:

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

oder

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

Dies funktioniert nicht für die Serviceklasse selbst. Es muss pro Methode sein, sonst erhalten Sie die gleiche Ausnahme. In der Dokumentation jedoch: Der standardmäßige Ziel-Bean-Name transactionManager wird weiterhin verwendet, wenn keine spezifisch qualifizierte PlatformTransactionManager-Bean gefunden wird. –

8

Eigentlich gibt ist ein Weg namens Transaction mit Feder zu verwenden Daten JPA. Dies funktioniert für mich:

<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> 
Verwandte Themen