복붙노트

[SPRING] Hibernate JPA와 Spring javax.persistence.TransactionRequiredException : 트랜잭션이 진행중이 아니다.

SPRING

Hibernate JPA와 Spring javax.persistence.TransactionRequiredException : 트랜잭션이 진행중이 아니다.

전화 할 때 :

entityManager.flush()

나는 제목에서 언급 된 예외를 얻는다.

나는 Hibernate JPA를 사용하고있다.

해결법

  1. ==============================

    1.이 문제가 발생하고 해결하기 위해 몇 시간을 보냈다가 마침내 그 이유를 발견했습니다. 동일한 클래스에 autowiring 수단에 대한 @Service 주석이 있으면 @Transactional 주석과 함께 버그가 있고 트랜잭션을 유지할 수 없습니다 .

    이 문제가 발생하고 해결하기 위해 몇 시간을 보냈다가 마침내 그 이유를 발견했습니다. 동일한 클래스에 autowiring 수단에 대한 @Service 주석이 있으면 @Transactional 주석과 함께 버그가 있고 트랜잭션을 유지할 수 없습니다 .

    해당 서비스 클래스에서 @Service 주석을 제거하고 적절한 bean을 XML config에 선언하면 다음을 수행 할 수 있습니다.

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

    문제는 사라졌다.

    자세한 내용은이 JIRA 버그를 확인하십시오.

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

    2.이 명령문이 실행될 때 활성 트랜잭션이 있는지 확인하십시오. JPA를 사용하는 경우 EntityManager.getTransaction (). begin ()을 사용하십시오. 이것은 JTA 트랜잭션 범위 밖에서 JPA를 사용하고 있다고 가정합니다.

    이 명령문이 실행될 때 활성 트랜잭션이 있는지 확인하십시오. JPA를 사용하는 경우 EntityManager.getTransaction (). begin ()을 사용하십시오. 이것은 JTA 트랜잭션 범위 밖에서 JPA를 사용하고 있다고 가정합니다.

    JTA 지원이있는 컨테이너에서 응용 프로그램을 실행하는 경우 JTA UserTransaction을 사용하여 트랜잭션을 관리 할 수도 있습니다.

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

    3.내 문제는 내 컨텍스트 정의에서 요소를 설정하는 방식과 관련이있다.

    내 문제는 내 컨텍스트 정의에서 요소를 설정하는 방식과 관련이있다.

    원래는 를 읽고 두 번째 속성을 제거하여로드 시간을 길들였습니다 (모든 것이 작동했습니다 (머리를 두드리는 데 2 ​​시간이 걸렸습니다) 그래도). 나는 두 번째 요소가 @Configurable 스테레오 타입과 관련이 있다고 믿지만, 다른 (더 똑똑한) 사람들이 차이점을 설명 할 수있는 이유와 왜 다른 하나는 작동하지 않을 것이라고 생각한다. 희망이있다.

    작업 정의 =

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

    4.이 명령문이 실행될 때 활성 트랜잭션이 있는지 확인하십시오. JPA를 사용하는 경우 EntityManager.getTransaction (). begin ()을 사용하십시오. 이것은 JTA 트랜잭션 범위 밖에서 JPA를 사용하고 있다고 가정합니다.

    이 명령문이 실행될 때 활성 트랜잭션이 있는지 확인하십시오. JPA를 사용하는 경우 EntityManager.getTransaction (). begin ()을 사용하십시오. 이것은 JTA 트랜잭션 범위 밖에서 JPA를 사용하고 있다고 가정합니다.

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

    5.이 문제가 발생했습니다. 메서드에 @Transacctional 주석을 추가하고 @Service 주석과 함께 클래스에 추가하십시오.

    이 문제가 발생했습니다. 메서드에 @Transacctional 주석을 추가하고 @Service 주석과 함께 클래스에 추가하십시오.

    예 :

    @Service
    @Transactional
    public class MyService {
    
    }
    
  6. ==============================

    6.귀하의 처리 방법이 공개로 선언되었는지 확인하십시오

    귀하의 처리 방법이 공개로 선언되었는지 확인하십시오

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

    7.Spring 4.3.1 / Hibernate 4.2.21

    Spring 4.3.1 / Hibernate 4.2.21

    저의 구성은 최대 절전 모드 나 스프링 XML 문서가없는 100 % Java 코드입니다 (예 : context.xml, persistence.xml 등). 문제는 TransactionManager에 전달한 EntityManagerFactory였습니다. 아래의 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;
    }
    
  8. ==============================

    8.나는 똑같은 문제가 있었다. 마침내 그 이유를 발견 할 때까지 몇 시간을 보냈다. 내 경우에는 예외가 발생했습니다.

    나는 똑같은 문제가 있었다. 마침내 그 이유를 발견 할 때까지 몇 시간을 보냈다. 내 경우에는 예외가 발생했습니다.

    내 mvc-core-config.xml에서 다음 줄이 그 이유입니다.

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

    다음과 같이 변경하면 모든 것이 다시 작동합니다.

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

    그래서 내 @Controller 클래스 대신 모든 응용 프로그램 패키지를 스캔하면 @ harshal-waghmare와 같은 문제가 발생할 수 있다고 생각합니다.

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

    9.스프링 구성에 다음 줄이 포함되어 있는지 확인하십시오.

    스프링 구성에 다음 줄이 포함되어 있는지 확인하십시오.

    모드는 프록시 또는 aspectj 일 수 있으며 트랜잭션 관리자는 트랜잭션 관리자를 가리켜 야합니다.

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

    10.스프링 3.0.0 / 3.0.3을 사용하여 나에게도 같은 일이 발생했습니다. 데이터는 JUnit에서 MySQL에는 유지되었지만 Tomcat 서버에서는 유지되지 않았습니다. 많은 작업을 한 후 JTA에 대한 RESOURCE_LOCAL을 포기했습니다.

    스프링 3.0.0 / 3.0.3을 사용하여 나에게도 같은 일이 발생했습니다. 데이터는 JUnit에서 MySQL에는 유지되었지만 Tomcat 서버에서는 유지되지 않았습니다. 많은 작업을 한 후 JTA에 대한 RESOURCE_LOCAL을 포기했습니다.

    이것은 나를 위해 일했다 http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ JTA를 사용하고 JOTM에 의존한다.

  11. ==============================

    11.나는 모든 것을 다음과 같이했다. 내 문제는 "가져 오기"태그와 함께, 서블릿 컨텍스트와 루트 컨텍스트와 같은 서로 의존하지 않는 몇 가지 컨텍스트 루트가 있습니다. STS에서 Spring Explorer보기로 명확 해집니다. Tomcat을위한 JTA 없음.

    나는 모든 것을 다음과 같이했다. 내 문제는 "가져 오기"태그와 함께, 서블릿 컨텍스트와 루트 컨텍스트와 같은 서로 의존하지 않는 몇 가지 컨텍스트 루트가 있습니다. STS에서 Spring Explorer보기로 명확 해집니다. Tomcat을위한 JTA 없음.

    내 충고는 보편적 일 것입니다 : 당신의 환경에서 Pet Clinic을 실행하십시오. Hibernate가 JPA를 지원하는 Tomcat에서 Spring 3.0 PetClinic을 실행하는 법 또는 응용 프로그램의 Roo 스텁으로 생성하고 참조 된 것과 configs를 비교해보십시오.

  12. ==============================

    12.JBoss 4.0과 Hibernate에서 EntityManagerFactoryBean 정의에 트랜잭션 관리자 속성을 추가하여이 문제를 해결했습니다.

    JBoss 4.0과 Hibernate에서 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>
    

    이 메시지 보드 스레드에서 해결책을 찾았습니다.

  13. ==============================

    13.나는이 오류를 마침내 추가하여

    나는이 오류를 마침내 추가하여

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

    내 application-context.xml에

  14. from https://stackoverflow.com/questions/1801828/hibernate-jpa-and-spring-javax-persistence-transactionrequiredexception-no-tran by cc-by-sa and MIT license