java - tabla - TransactionRequiredException Ejecutando una consulta de actualización/eliminación
consultas en access (12)
Hola. Estoy usando Hibernate JPA con spring y mongodb y estoy ejecutando mi aplicación en Glassfish-4.0.
Mi clase de servicio es
@Component
public class Test {
@PersistenceContext
EntityManager em;
EntityManagerFactory emf;
@Transactional
public String persist(Details details){
details.getUsername();
details.getPassword();
Query query = em.createNativeQuery("db.details.find(username= "+details.getUsername()+"& password= "+details.getPassword());
em.getTransaction().begin();
em.persist(details);
em.getTransaction().commit();
em.flush();
em.clear();
em.close();
query.executeUpdate();
System.out.println("Sucessful!");
return "persist";
}
}
Y mi spring-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<context:component-scan base-package="com.javapapers.spring.mvc" />
<context:annotation-config/>
<mvc:annotation-driven />
<tx:annotation-driven transaction-manager="txManager" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
<property name="persistenceUnitName" value="ogmTest"/>
</bean>
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager">
</bean>
</beans>
He aplicado algunos cambios en el código pero no tiene ningún efecto. ¿Alguien puede por favor ayudarme a resolver esto? Gracias por adelantado.
¿Qué hay de mover @Transactional
del método al nivel de clase? Me funcionó en un caso similar, aunque no estoy 100% seguro de por qué.
Como forma el xml de configuración, está claro que va a utilizar transacciones basadas en Spring. Asegúrese de que la importación que está utilizando para @Transactional es "org.springframework.transaction.annotation.Transactional"
en su caso podría ser "javax.transaction.Transactional"
aclamaciones
Chetan verma
Después de integrar Spring 4 con Hibernate 5 en mi proyecto y experimentar este problema, descubrí que podía evitar que apareciera el error cambiando la forma de obtener la sesión de sessionFactory.openSession()
a sessionFactory.getCurrentSession()
. la forma correcta de resolver este error puede seguir utilizando la misma sesión para la transacción de transacción. La sesión siempre creará una nueva sesión que no le guste a la anterior que tenga una transacción configed.using getCurrentSession y agregue propiedades adicionales <property name="current_session_context_class">org.springframework.orm.hibernate5.SpringSessionContext</property>
funciona bien para mí.
En mi caso he importado el @Transaction
equivocado. El correcto es:
org.springframework.transaction.annotation.Transactional
y no javax.transaction.Transactional
.
Me enfrenté a la misma excepción " TransactionRequiredException Ejecutando una consulta de actualización / eliminación ", pero para mí el motivo fue que he creado otro bean en el archivo spring applicationContext.xml con el nombre " transactionManager " que hace referencia a " org.springframework.jms.connection .JmsTransactionManage r "sin embargo, había otro bean con el mismo nombre" transactionManager "que se refiere a" org.springframework.orm.jpa.JpaTransactionManager ". Así que el bean JPA está sobreescrito por el bean JMS .
Después de renombrar el nombre de bean de Jms, el problema se resuelve.
Nada pareció funcionar para mí hasta que me di cuenta de que mi método fue declarado como public final
lugar de public
. El error fue causado por la palabra clave final
. Eliminarlo hizo que el error desapareciera.
No estoy seguro de si esto te ayudará en tu situación (es decir, si aún existe), sin embargo, después de haber rastreado la web en busca de un problema similar.
Estaba creando una consulta nativa desde un gestor de entidad de persistencia para realizar una actualización.
Query query = entitymanager.createNativeQuery(queryString);
Estaba recibiendo el siguiente error:
causado por: javax.persistence.TransactionRequiredException: ejecutar una consulta de actualización / eliminación
Muchas soluciones sugieren agregar @Transactional a su método. Sólo haciendo esto no cambió el error.
Algunas soluciones sugieren pedirle al gestor de entidades un EntityTransaction
para que pueda llamar comenzar y comprometerse. Esto arroja otro error:
causado por: java.lang.IllegalStateException: No se permite crear transacciones en EntityManager compartido; use transacciones Spring o EJB CMT en su lugar
Luego probé un método que, según la mayoría de los sitios, es para usar administradores de entidades administradas por aplicaciones y no para contenedores (lo que creo que es Spring) y fue joinTransaction()
.
Tener @Transactional
decorando el método y luego invocar joinTransation()
en el objeto EntityManager justo antes de llamar a query.executeUpdate()
y mi actualización de consulta nativa funcionó.
Espero que esto ayude a alguien más a experimentar este problema.
No tiene que preocuparse por comenzar y terminar la transacción. Ya ha aplicado la anotación @Transactional, que abre transacciones internamente cuando su método comienza y finaliza cuando finaliza su método. Tan solo se requiere que esto sea para persistir su objeto en la base de datos.
@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class})
public String persist(Details details){
details.getUsername();
details.getPassword();
Query query = em.createNativeQuery("db.details.find(username= "+details.getUsername()+"& password= "+details.getPassword());
em.persist(details);
System.out.println("Sucessful!");
return "persist";
}
EDITAR: El problema parece estar en su archivo de configuración. Si está utilizando JPA, entonces su archivo de configuración debe tener la siguiente configuración
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
p:entityManagerFactory-ref="entityManagerFactory" />
<bean id="jpaAdapter"
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
p:database="ORACLE" p:showSql="true" />
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
p:persistenceUnitName="YourProjectPU"
p:persistenceXmlLocation="classpath*:persistence.xml"
p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
</property>
<property name="persistenceProvider" ref="interceptorPersistenceProvider" />
</bean>
Recibí esta excepción al intentar ejecutar una consulta de ACTUALIZACIÓN masiva en un administrador de entidades no JTA (es decir, de recursos locales) en Java SE. Simplemente me había olvidado de envolver mi código JPQL
em.getTransaction().begin();
y
em.getTransaction().commit();
También he enfrentado el mismo problema cuando trabajo con Hibernate y Spring Jpa Data Repository. Olvidé colocar @Transactional
en el método del repositorio de datos de Spring.
Su trabajo para mí después de la anotación con @Transactional
.
Tengo el mismo error.
Acabo de agregar la anotación @Transactional de javax.transaction.Transactional en el método.
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Transactional
public int changepassword(String password, long mobile) {
// TODO Auto-generated method stub
session = factory.getCurrentSession();
Query query = session.createQuery("update User u set u.password=''" + password + "'' where u.mobile=" + mobile);
int result = query.executeUpdate();
return result;
}
add this code 200% it will work... might scenario is diff but write like this:)