복붙노트

[SPRING] TransactionRequiredException 업데이트 / 삭제 쿼리 실행

SPRING

TransactionRequiredException 업데이트 / 삭제 쿼리 실행

안녕하세요, 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. ==============================

    1.그러나 비슷한 문제가있는 웹을 뒤집은 후 상황이 도움이 될지 확신 할 수 없습니다 (즉, 여전히 존재하는 경우).

    그러나 비슷한 문제가있는 웹을 뒤집은 후 상황이 도움이 될지 확신 할 수 없습니다 (즉, 여전히 존재하는 경우).

    지속성 엔티티 관리자에서 네이티브 쿼리를 생성하여 업데이트를 수행했습니다.

    Query query = entitymanager.createNativeQuery(queryString);
    

    다음과 같은 오류가 발생했습니다.

    많은 솔루션은 @Transactional을 메서드에 추가 할 것을 제안합니다. 이렇게하면 오류가 변경되지 않습니다.

    일부 솔루션은 EntityTransaction을 EntityTransaction에 요청하여 EntityTransaction을 호출하여 직접 시작하고 커밋 할 수 있다고 제안합니다. 그러면 다른 오류가 발생합니다.

    그런 다음 대부분의 사이트에서 사용하는 응용 프로그램 관리 엔티티 관리자가 아니라 컨테이너 관리 (Spring이 있다고 생각하는) 메소드와 joinTransaction () 메소드를 시도했습니다.

    @Transactional에서 메서드를 꾸미고 query.executeUpdate ()를 호출하기 직전에 EntityManager 객체에서 joinTransation ()을 호출하면 내 기본 쿼리 업데이트가 작동합니다.

    이 문제로 다른 사람이 도움이되기를 바랍니다.

  2. ==============================

    2.구성 XML 형식으로 봄 기반 트랜잭션을 사용하려고합니다. @Transactional에 사용하는 가져 오기가 "org.springframework.transaction.annotation.Transactional"인지 확인하십시오.

    구성 XML 형식으로 봄 기반 트랜잭션을 사용하려고합니다. @Transactional에 사용하는 가져 오기가 "org.springframework.transaction.annotation.Transactional"인지 확인하십시오.

    귀하의 경우에는 "javax.transaction.Transactional"

    건배

    Chetan Verma

  3. ==============================

    3.제 경우에는 @Transaction을 잘못 가져 왔습니다. 올바른 것 :

    제 경우에는 @Transaction을 잘못 가져 왔습니다. 올바른 것 :

    org.springframework.transaction.annotation.Transactional
    

    및 javax.transaction.Transactional 없습니다.

  4. ==============================

    4.나는 또한 Hibernate와 Spring Jpa Data Repository로 작업 할 때 같은 문제에 직면했다. Spring 데이터 저장소 방법에 @Transactional을 배치하는 것을 잊었습니다. @Transactional을 사용하여 주석을 작성한 후 저를 위해 일합니다.

    나는 또한 Hibernate와 Spring Jpa Data Repository로 작업 할 때 같은 문제에 직면했다. Spring 데이터 저장소 방법에 @Transactional을 배치하는 것을 잊었습니다. @Transactional을 사용하여 주석을 작성한 후 저를 위해 일합니다.

  5. ==============================

    5.메서드에서 클래스 수준으로 @Transactional을 이동하는 것은 어떨까요? 나는 100 % 확신 할 수는 없지만 비슷한 경우에 나를 위해 일했다.

    메서드에서 클래스 수준으로 @Transactional을 이동하는 것은 어떨까요? 나는 100 % 확신 할 수는 없지만 비슷한 경우에 나를 위해 일했다.

  6. ==============================

    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. ==============================

    7.내 방법이 공개가 아닌 공개 최종으로 선언되었다는 것을 알기 전까지는 아무 것도 저에게 효과가 없었습니다. 최종 키워드 때문에 오류가 발생했습니다. 제거하면 오류가 사라집니다.

    내 방법이 공개가 아닌 공개 최종으로 선언되었다는 것을 알기 전까지는 아무 것도 저에게 효과가 없었습니다. 최종 키워드 때문에 오류가 발생했습니다. 제거하면 오류가 사라집니다.

  8. ==============================

    8.나는 같은 오류가 발생했습니다.

    나는 같은 오류가 발생했습니다.

    메소드에 javax.transaction.Transactional의 @Transactional 어노테이션을 추가했습니다.

  9. ==============================

    9.내 프로젝트에서 Spring 4와 Hibernate 5를 통합하고이 문제를 경험 한 후에, sessionFactory.openSession ()에서 sessionFactory.getCurrentSession ()으로 세션을 가져 오는 방법을 변경하여 오류가 나타나지 않도록 할 수 있음을 발견했다. 이 버그를 해결하는 적절한 방법은 바인딩 transaction.opensession에 대해 동일한 세션을 계속 사용하는 것입니다. getCurrentSession을 사용하고 추가 속성 org.springframework.orm.hibernate5.SpringSessionContext 는 저에게 잘 작동합니다.

    내 프로젝트에서 Spring 4와 Hibernate 5를 통합하고이 문제를 경험 한 후에, sessionFactory.openSession ()에서 sessionFactory.getCurrentSession ()으로 세션을 가져 오는 방법을 변경하여 오류가 나타나지 않도록 할 수 있음을 발견했다. 이 버그를 해결하는 적절한 방법은 바인딩 transaction.opensession에 대해 동일한 세션을 계속 사용하는 것입니다. getCurrentSession을 사용하고 추가 속성 org.springframework.orm.hibernate5.SpringSessionContext 는 저에게 잘 작동합니다.

  10. ==============================

    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. ==============================

    11.Java SE에서 비 JTA (즉, 리소스 로컬) 엔티티 관리자에서 대량 업데이트 쿼리를 실행하려고 할 때이 예외가 발생했습니다. 나는 내 JPQL 코드를 다음과 같이 포장하는 것을 잊어 버렸다.

    Java SE에서 비 JTA (즉, 리소스 로컬) 엔티티 관리자에서 대량 업데이트 쿼리를 실행하려고 할 때이 예외가 발생했습니다. 나는 내 JPQL 코드를 다음과 같이 포장하는 것을 잊어 버렸다.

    em.getTransaction().begin();
    

    em.getTransaction().commit();
    
  12. ==============================

    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:)
    
  13. from https://stackoverflow.com/questions/25821579/transactionrequiredexception-executing-an-update-delete-query by cc-by-sa and MIT license