tutorial transaction management data and java spring jpa

java - management - spring transaction commit and rollback



Hibernate JPA y Spring javax.persistence.TransactionRequiredException: no hay ninguna transacción en curso (13)

Cuando llamo:

entityManager.flush()

Obtengo la excepción mencionada en el título.

Estoy usando Hibernate JPA.


Asegúrese de que su configuración de resorte incluya la siguiente línea:

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

mode puede ser proxy o aspectj y transaction-manager tiene que apuntar a su administrador de transacciones.


Asegúrese de tener una transacción activa cuando se ejecute esta instrucción. Si está utilizando JPA use EntityManager.getTransaction().begin() . Esto supone que está utilizando JPA fuera de un alcance de transacción JTA.


Asegúrese de tener una transacción activa cuando se ejecute esta instrucción. Si está utilizando JPA use EntityManager.getTransaction (). Begin (). Esto supone que está utilizando JPA fuera de un alcance de transacción JTA.

Si está ejecutando la aplicación dentro de un contenedor con soporte JTA también puede usar JTA UserTransaction para administrar transacciones.


Después de enfrentarme a este problema y pasar unas horas tratando de resolverlo, finalmente encontré una razón para ello: Spring tiene un error y no puede mantener las transacciones con la anotación @Transactional si la misma clase tiene la anotación @Service para los medios de autoenvío. .

Una vez que se @Service anotación @Service de la clase de servicio en cuestión, y se declaró un bean apropiado en la configuración XML:

<bean id="myService" class="com.example.myapp.service.MyServiceImpl" />

el problema se ha ido.

Verifique este error JIRA para más detalles.


Finalmente he arreglado este error añadiendo

<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" />

en mi application-context.xml


Hice todo el asunto como un seguidor. Mis problemas eran con la etiqueta "importar", hay varias raíces de contexto como servlet-context y root-context que no son dependientes entre sí. Se vuelve claro con la vista de Spring Explorer en STS. No hay JTA para Tomcat.

Mi consejo sería universal: ejecutar Pet Clinic en su entorno, cómo ejecutar Spring 3.0 PetClinic en tomcat con HPA respaldado por Hibernate o generar con Roo stub de aplicación e intentar comparar sus configuraciones con las referenciadas.



Mi problema tenía que ver con la forma en que configuraba el elemento <tx:annotation-driven/> en mi definición de contexto -

Originalmente tuve el tiempo de carga habilitado (no conocido) que decía <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> y simplemente eliminando el 2do atributo - todo funcionó (tomó 2 horas de golpear la cabeza) aunque). Creo que el segundo elemento se relaciona con el esterotipo @Configurable pero puede permitir que otras personas (más inteligentes) expliquen la diferencia y por qué uno funcionaría y el otro no ... Espero que esto ayude ...

definición de trabajo = <tx:annotation-driven transaction-manager="transactionManager"/>


Para JBoss 4.0 e Hibernate, solucioné este problema agregando algunas propiedades de administrador de transacciones a mi definición EntityManagerFactoryBean :

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="xaDs" /> <property name="jpaProperties"> <props> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory </prop> <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup </prop> </props> </property>

Encontré la solución en este hilo de tablero de mensajes .


Por favor, asegúrese de que el método de su controlador sea declarado como public

@Transactional @RequestMapping(''/test'') public String doTest() { // do your stuff here return ''testview''; }


Spring 4.3.1 / Hibernate 4.2.21

Mi configuración era 100% código Java sin hibernación ni documentos XML de primavera (por ejemplo, context.xml, persistence.xml, etc.). El problema era EntityManagerFactory que estaba pasando a TransactionManager , consulte la configuración siguiente en el método transactionManager .

@Configuration @EnableTransactionManagement public class HibernateConfiguration2 { @Bean public DataSource dataSource() { return ...; // Build a basic datasource } @Bean @Autowired public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); entityManagerFactory.setDataSource(dataSource); entityManagerFactory.setPackagesToScan("nz.co.mark"); entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class); return entityManagerFactory; } @Bean @Autowired public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) { EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager(); em.setFlushMode(FlushModeType.AUTO); return em; } @Bean @Autowired public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception { JpaTransactionManager transactionManager = new JpaTransactionManager(); transactionManager.setEntityManagerFactory(emf.getObject()); // The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress // transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory()); return transactionManager; }


Tuve el mismo problema ... pasé algunas horas hasta que finalmente encontré el motivo. Era solo una línea de código que causaba la excepción en mi caso ...

En mi mvc-core-config.xml, la siguiente línea fue la razón:

<context:component-scan base-package="com.my.package.application" />

Después de cambiarlo de la siguiente manera, todo funcionó de nuevo:

<context:component-scan base-package="com.my.package.application.controller" />

Así que supongo que el escaneo de todos mis paquetes de aplicaciones en lugar de solo mis clases @Controller lleva al problema como @ harshal-waghmare mencionado en su publicación a otra respuesta .


Tuve este problema, solo agregue la anotación @Transacctional no solo en el método, también en la clase junto con su anotación @Service.

por ejemplo:

@Service @Transactional public class MyService { }