2012-05-23 12 views
21

que han configurado dos unidades persistentes con los gestores de entidad configurar como se muestra a continuación:Sin bean llamado 'transactionManager' se define

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

luego configuré los administradores de transacciones como

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

que originalmente tenía solo uno configurado y se llamaba "transactionManager". Addint una unidad persistente adicional parece generar un error. Una cosa que no entiendo, si configuré dos unidades persistentes (cada una para una base de datos separada) ¿también necesito configurar un administrador de entidades individuales y un administrador de transacciones para cada fuente de datos?

El error que me sale se muestra a continuación: (Tengo buscar todos los archivos y no puedo encontrar en cualquier lugar donde hay una referencia para "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) 

estoy usando primavera con Jpa/Hibernate.

Gracias

+0

Debe usar solo un TransactionManager, y su bean debe llamarse "transactionManager". – Luciano

+0

El administrador de transacciones debe tener una referencia a EntityManagerFactoryBean como se muestra arriba. ¿Cómo lo configuraría si tengo dos EntityManagerFactoryBean? (Cada uno para un origen de datos separado) – ziggy

+2

JPATransactionManager funciona si está utilizando solo un EntityManager. Si usa más de uno, necesita consistencia entre todos sus orígenes de datos, por lo que debe recurrir a org.springframework.transaction.jta.JtaTransactionManager. ¿Estás familiarizado con JTA? – Luciano

Respuesta

25

El valor por defecto para el atributo de transacción-gerente es transaction-manager. En su caso, se debe especificar el administrador de transacciones que desea utilizar por método o servicio como este:

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

o

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

Esto no funcionará en la clase de servicio en sí. Debe ser por método, de lo contrario obtendrá la misma excepción. Sin embargo, de acuerdo con la documentación: El nombre predeterminado del paquete de destino transactionManager se seguirá utilizando si no se encuentra un bean PlatformTransactionManager específicamente calificado. –

8

En realidad, hay es una manera de utilizar nombrado TransactionManager con la primavera Datos JPA. Esto funciona para mí:

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