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.
Lo mismo me estaba pasando usando la primavera 3.0.0 / 3.0.3. Los datos se mantuvieron en MySQL desde JUnit pero no desde el servidor de tomcat. Después de tanto trabajo, renuncié a RESOURCE_LOCAL para JTA.
Esto funcionó para mí http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ Utiliza JTA y depende de JOTM.
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 {
}