2011-03-05 25 views
6

Entiendo que se ha hecho la misma pregunta antes aquí, pero no he podido encontrar la solución a mi problema. Básicamente, estoy tratando de usar JPA a través de Hibernate en Spring, pero los datos son no persistiendo por algún motivo. Activar la depuración en la transacción de primavera no revela nada - EntityManager abierto y cerrado, pero no aparece nada en lo que concierne al administrador de transacciones ... Estoy seguro de que echo de menos algo grande, ¡cualquier ayuda es apreciada! mira lo siguiente para más detalles.Spring + JPA @Transactional no confirma

TIA

Oliver

El diseño básico es el siguiente: Clase FooDaoJPA ‘s función de ahorro de llama entityManager.persist(object) a conservar el objeto.

clase FooServiceImpl implementa la interfaz de servicio por:

@Transactional(rollbackFor = DataAccessException.class, 
        readOnly = false, timeout = 30, 
        propagation = Propagation.SUPPORTS, 
        isolation = Isolation.DEFAULT) 
public void saveFoo(Foo foo) throws DataAccessException { 
     fooDao.save(foo); 
} 

Observó que fooDao se inyecta por resorte IoC

último controlador se inyecta un FooService y llaman saveFoo() para persistir datos.

configuración JPA

<!-- JPA Entity Manager Factory --> 
<bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" 
      p:dataSource-ref="feDataSource"/> 

<!-- Transaction Config --> 
<bean id="transactionManager" 
      class="org.springframework.orm.jpa.JpaTransactionManager" 
      p:entityManagerFactory-ref="entityManagerFactory"/> 

<tx:annotation-driven mode="aspectj"       
transaction-manager="transactionManager"/> 
+0

remove rollbackFor = DataAccessException.class y la llamada de dao surround con try catch para depuración propósito – blob

Respuesta

1

Tenga en cuenta mode="aspectj" en su configuración. Requiere configuración adicional y, por lo general, no debe usarlo a menos que comprenda qué significa y por qué lo necesita. Ver 10.5.6 Using @Transactional.

+0

Aunque la respuesta no aborda directamente el problema, pero creo que el "aspectj" y su configuración relacionada (que hace que el tiempo de carga se entrelaza) es el culpable del problema. Gracias por tu ayuda. – Oliver

1

La primera cosa que se ve como un problema potencial es el ajuste para la propagación . Aquí está la documentación que muestra los valores que puede especificar:

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/transaction/annotation/Propagation.html

Tenga en cuenta que ha especificado soportes que "apoyar una transacción en curso, no se ejecutan de forma transaccional si no existe ninguno". Probablemente desee OBLIGATORIO, que es el predeterminado, y usará una transacción existente o creará una si no existe actualmente.

+0

Primero, thx para la respuesta. Y aunque lo que sugieres tiene sentido, pero lo intenté con la propagación requerida, no parece marcar la diferencia. Además, la configuración original que tomé del libro de Apress "Spring Persistence with JPA" (Persistencia de primavera con JPA) - pero hay un buen número de errores/incoherencias en ese libro, tampoco lo apostaría. – Oliver

0

En mi caso:

El uso de JPA con Spring MVC - todas mis pruebas y el código funcionó muy bien sin error - síntoma fue que compromete simplemente no guardar en la base de datos, no importa lo que he intentado.

he tenido que añadir a mi applicationContext.xml y cglib-nodep-2.1_3.jar aopalliance-1.0.jar

Definitivamente la solución en mi caso. Sin resorte impulsado por anotación no buscará la anotación @Transactional

Cuestiones relacionadas