[SPRING] TransactionRequiredException 업데이트 / 삭제 쿼리 실행
SPRINGTransactionRequiredException 업데이트 / 삭제 쿼리 실행
안녕하세요, Spring과 mongodb를 사용하여 최대 절전 모드 JPA를 사용하고 있으며 Glassfish-4.0에서 내 응용 프로그램을 실행하고 있습니다.
내 서비스 클래스는
@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";
}
}
그리고 내 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>
코드에서 일부 변경 사항을 적용했지만 효과가 없습니다. 누구든지이 문제를 해결할 수 있도록 도와주세요. 미리 감사드립니다.
해결법
-
==============================
1.그러나 비슷한 문제가있는 웹을 뒤집은 후 상황이 도움이 될지 확신 할 수 없습니다 (즉, 여전히 존재하는 경우).
그러나 비슷한 문제가있는 웹을 뒤집은 후 상황이 도움이 될지 확신 할 수 없습니다 (즉, 여전히 존재하는 경우).
지속성 엔티티 관리자에서 네이티브 쿼리를 생성하여 업데이트를 수행했습니다.
Query query = entitymanager.createNativeQuery(queryString);
다음과 같은 오류가 발생했습니다.
많은 솔루션은 @Transactional을 메서드에 추가 할 것을 제안합니다. 이렇게하면 오류가 변경되지 않습니다.
일부 솔루션은 EntityTransaction을 EntityTransaction에 요청하여 EntityTransaction을 호출하여 직접 시작하고 커밋 할 수 있다고 제안합니다. 그러면 다른 오류가 발생합니다.
그런 다음 대부분의 사이트에서 사용하는 응용 프로그램 관리 엔티티 관리자가 아니라 컨테이너 관리 (Spring이 있다고 생각하는) 메소드와 joinTransaction () 메소드를 시도했습니다.
@Transactional에서 메서드를 꾸미고 query.executeUpdate ()를 호출하기 직전에 EntityManager 객체에서 joinTransation ()을 호출하면 내 기본 쿼리 업데이트가 작동합니다.
이 문제로 다른 사람이 도움이되기를 바랍니다.
-
==============================
2.구성 XML 형식으로 봄 기반 트랜잭션을 사용하려고합니다. @Transactional에 사용하는 가져 오기가 "org.springframework.transaction.annotation.Transactional"인지 확인하십시오.
구성 XML 형식으로 봄 기반 트랜잭션을 사용하려고합니다. @Transactional에 사용하는 가져 오기가 "org.springframework.transaction.annotation.Transactional"인지 확인하십시오.
귀하의 경우에는 "javax.transaction.Transactional"
건배
Chetan Verma
-
==============================
3.제 경우에는 @Transaction을 잘못 가져 왔습니다. 올바른 것 :
제 경우에는 @Transaction을 잘못 가져 왔습니다. 올바른 것 :
org.springframework.transaction.annotation.Transactional
및 javax.transaction.Transactional 없습니다.
-
==============================
4.나는 또한 Hibernate와 Spring Jpa Data Repository로 작업 할 때 같은 문제에 직면했다. Spring 데이터 저장소 방법에 @Transactional을 배치하는 것을 잊었습니다. @Transactional을 사용하여 주석을 작성한 후 저를 위해 일합니다.
나는 또한 Hibernate와 Spring Jpa Data Repository로 작업 할 때 같은 문제에 직면했다. Spring 데이터 저장소 방법에 @Transactional을 배치하는 것을 잊었습니다. @Transactional을 사용하여 주석을 작성한 후 저를 위해 일합니다.
-
==============================
5.메서드에서 클래스 수준으로 @Transactional을 이동하는 것은 어떨까요? 나는 100 % 확신 할 수는 없지만 비슷한 경우에 나를 위해 일했다.
메서드에서 클래스 수준으로 @Transactional을 이동하는 것은 어떨까요? 나는 100 % 확신 할 수는 없지만 비슷한 경우에 나를 위해 일했다.
-
==============================
6.거래 시작 및 종료에 대해 걱정할 필요가 없습니다. 메소드가 시작될 때 트랜잭션을 내부적으로 여는 @Transactional 어노테이션을 이미 적용했습니다. 메소드가 끝나면 끝납니다. 따라서 데이터베이스에 개체를 유지해야합니다.
거래 시작 및 종료에 대해 걱정할 필요가 없습니다. 메소드가 시작될 때 트랜잭션을 내부적으로 여는 @Transactional 어노테이션을 이미 적용했습니다. 메소드가 끝나면 끝납니다. 따라서 데이터베이스에 개체를 유지해야합니다.
@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"; }
편집 : 문제는 구성 파일을 것 같다. JPA를 사용하는 경우 구성 파일의 구성이 아래와 같아야합니다.
<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>
-
==============================
7.내 방법이 공개가 아닌 공개 최종으로 선언되었다는 것을 알기 전까지는 아무 것도 저에게 효과가 없었습니다. 최종 키워드 때문에 오류가 발생했습니다. 제거하면 오류가 사라집니다.
내 방법이 공개가 아닌 공개 최종으로 선언되었다는 것을 알기 전까지는 아무 것도 저에게 효과가 없었습니다. 최종 키워드 때문에 오류가 발생했습니다. 제거하면 오류가 사라집니다.
-
==============================
8.나는 같은 오류가 발생했습니다.
나는 같은 오류가 발생했습니다.
메소드에 javax.transaction.Transactional의 @Transactional 어노테이션을 추가했습니다.
-
==============================
9.내 프로젝트에서 Spring 4와 Hibernate 5를 통합하고이 문제를 경험 한 후에, sessionFactory.openSession ()에서 sessionFactory.getCurrentSession ()으로 세션을 가져 오는 방법을 변경하여 오류가 나타나지 않도록 할 수 있음을 발견했다. 이 버그를 해결하는 적절한 방법은 바인딩 transaction.opensession에 대해 동일한 세션을 계속 사용하는 것입니다. getCurrentSession을 사용하고 추가 속성
org.springframework.orm.hibernate5.SpringSessionContext property>는 저에게 잘 작동합니다. 내 프로젝트에서 Spring 4와 Hibernate 5를 통합하고이 문제를 경험 한 후에, sessionFactory.openSession ()에서 sessionFactory.getCurrentSession ()으로 세션을 가져 오는 방법을 변경하여 오류가 나타나지 않도록 할 수 있음을 발견했다. 이 버그를 해결하는 적절한 방법은 바인딩 transaction.opensession에 대해 동일한 세션을 계속 사용하는 것입니다. getCurrentSession을 사용하고 추가 속성
org.springframework.orm.hibernate5.SpringSessionContext property>는 저에게 잘 작동합니다. -
==============================
10.나는 "TransactionRequiredException Update / Delete query를 실행하는 것과 같은 예외"를 겪었지만, 나를 위해 spring applicationContext.xml 파일에 "transactionManager"라는 이름으로 또 다른 bean을 생성했다. "org.springframework.jms.connection .JmsTransactionManager "하지만"org.springframework.orm.jpa.JpaTransactionManager "를 참조하는"transactionManager "라는 이름의 다른 bean이 있습니다. 따라서 JPA bean은 JMS bean에 의해 overriten됩니다.
나는 "TransactionRequiredException Update / Delete query를 실행하는 것과 같은 예외"를 겪었지만, 나를 위해 spring applicationContext.xml 파일에 "transactionManager"라는 이름으로 또 다른 bean을 생성했다. "org.springframework.jms.connection .JmsTransactionManager "하지만"org.springframework.orm.jpa.JpaTransactionManager "를 참조하는"transactionManager "라는 이름의 다른 bean이 있습니다. 따라서 JPA bean은 JMS bean에 의해 overriten됩니다.
Jms의 빈 이름을 변경 한 후에는 문제가 해결됩니다.
-
==============================
11.Java SE에서 비 JTA (즉, 리소스 로컬) 엔티티 관리자에서 대량 업데이트 쿼리를 실행하려고 할 때이 예외가 발생했습니다. 나는 내 JPQL 코드를 다음과 같이 포장하는 것을 잊어 버렸다.
Java SE에서 비 JTA (즉, 리소스 로컬) 엔티티 관리자에서 대량 업데이트 쿼리를 실행하려고 할 때이 예외가 발생했습니다. 나는 내 JPQL 코드를 다음과 같이 포장하는 것을 잊어 버렸다.
em.getTransaction().begin();
과
em.getTransaction().commit();
-
==============================
12.
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:)
from https://stackoverflow.com/questions/25821579/transactionrequiredexception-executing-an-update-delete-query by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] classpath를 사용 : 봄 (0) | 2019.01.30 |
---|---|
[SPRING] Spring Boot Application 클래스가 @Configuration annotation을 필요로하는 이유는 무엇입니까? (0) | 2019.01.30 |
[SPRING] 왜 항상 서비스 및 DAO 계층에 단일 구현 인터페이스가 있습니까? (0) | 2019.01.30 |
[SPRING] 스프링 유닛 테스트 중에 ApplicationContext를로드하지 못했습니다. (0) | 2019.01.30 |
[SPRING] javax.validation.ValidationException : 기본 공급자를 찾을 수 없습니다. (0) | 2019.01.30 |