복붙노트

[SPRING] Spring IllegalStateException : JTA EntityManager는 getTransaction ()을 사용할 수 없다.

SPRING

Spring IllegalStateException : JTA EntityManager는 getTransaction ()을 사용할 수 없다.

그래서 큰 리팩토링 프로젝트가 끝난 후에 나는이 예외로 남았고 그것을 수정하는 방법이 확실치 않습니다. 그것은 쓰지 않은 코드를 다루고 있으며 어떻게 작동하는지 익숙하지 않습니다. 이 예외를 다루는 다른 질문이 있지만 내 상황에 맞지 않는 질문은 없습니다.

EntityManager를 사용하는 클래스는 SpecialClaimsCaseRepositoryImpl입니다.

package com.redacted.sch.repository.jpa;

//Imports

@Repository
public class SpecialClaimsCaseRepositoryImpl extends SimpleJpaRepository<SpecialClaimsCaseDto, SpecialClaimsCaseDto.Id> implements SpecialClaimsCaseRepository{

    @PersistenceContext(unitName = "schManager")
    private EntityManager em;

          //Some autogenerated methods

    public void setEntityManager(EntityManager em) {
        this.em = em;
    }

    public EntityManager getEntityManager() {
        return em;
    }
}

Persistence.xml :

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
    version="1.0">

    <persistence-unit name="schManager">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/SCH_DS</jta-data-source>
        <class>com.redacted.sch.domain.model.SpecialClaimsCaseDto</class>
        <properties>
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" />
            <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />
            <property name="hibernate.cache.use_query_cache" value="true" />
            <property name="hibernate.cache.use_second_level_cache" value="true" />
            <property name="hibernate.dialect" value="com.bcbsks.hibernate.dialect.DB2Dialect" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.generate_statistics" value="false" />
            <property name="hibernate.jdbc.use_scrollable_resultset" value="true" />
        </properties>
    </persistence-unit>
</persistence>

sch_model_spring.xml :

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

        <context:component-scan base-package="com.redacted.repository.jpa,
              com.redacted.sch.domain.model,
              com.redacted.sch.repository.jpa,
              com.redacted.sch.service,
              com.redacted.sch.service.impl"/>

        <tx:annotation-driven />

        <tx:jta-transaction-manager />

        <!-- Data source used for testing -->
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver" />
            <property name="url" value="jdbc:db2:redacted.redacted.com" />
            <property name="username" value="redacted" />
            <property name="password" value="redacted" />
        </bean>

        <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
              <property name="persistenceUnitName" value="schManager" />
              <property name="dataSource" ref="dataSource" />
        </bean>

        <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
            <property name="entityManagerFactory" ref="entityManagerFactory" />
        </bean> 
</beans>

그리고 내 프로젝트 구조는 다음과 같습니다.

>

다음은 스택 트레이스의 일부이며,이 fpaste에서 전체 트레이스가 있습니다.

Caused by: java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction()
    at org.hibernate.ejb.AbstractEntityManagerImpl.getTransaction(AbstractEntityManagerImpl.java:985)
    at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:67)
    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
    ... 80 more

나는 여기서 멍청한 멍청한 녀석이다. 그래서 다른 어떤 정보라도 필요하다면 나는 묻는다. 나는 갱신 할 것이다.

모든 도움에 감사드립니다!

해결법

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

    1.문제는 구성입니다. JTA를 위해 구성된 최대 절전 모드입니다.

    문제는 구성입니다. JTA를 위해 구성된 최대 절전 모드입니다.

    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup" />
    

    분산 트랜잭션 대신 로컬 트랜잭션을 사용하는 반면.

    at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:380)
    

    가능한 솔루션은 2 가지입니다.

    분산 트랜잭션을 필요로하지 않는다면 옵션 2가 가장 쉽습니다. 분산 트랜잭션이 필요하다면 를 추가하면 환경에 맞는 JTA tx 관리자를 설정할 수 있습니다. JpaTransactionManager에 대한 정의를 제거하십시오.

    최신 정보:

    구성에 결함이 2 가지 있습니다.

    JTA en JNDI 조회를 사용하여 로컬 테스트 및 프로덕션 용으로 2 개의 개별 구성을 작성하십시오. (테스트 코드가 필요한 bean을 우선하는 것보다 선호합니다).

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

    2.최대 절전 모드에서 트랜잭션 관리자 조회를 위해 WebSphereTransactionManagerLookup 사용

    최대 절전 모드에서 트랜잭션 관리자 조회를 위해 WebSphereTransactionManagerLookup 사용

    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereTransactionManagerLookup" />
    

    현재 트랜잭션 관리자를 제거하고이를 WebSphereUowTransactionManager로 바꾸십시오.

    <tx:annotation-driven/>
    <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
    

    Spring에서 트랜잭션 관리자 검색을 수행한다.

    IBM Websphere와 Spring 문서보기  더 깊이있는 문서화.

  3. from https://stackoverflow.com/questions/24704870/spring-illegalstateexception-a-jta-entitymanager-cannot-use-gettransaction by cc-by-sa and MIT license