복붙노트

[SPRING] java.lang.IllegalStateException : 사용할 수있는 트랜잭션 가능한 EntityManager가 없습니다.

SPRING

java.lang.IllegalStateException : 사용할 수있는 트랜잭션 가능한 EntityManager가 없습니다.

프로젝트는 Hibernate (JPA), Spring과 Maven을 사용한다. 내 엔티티와 DAO는 별도의 JAR에 있습니다.

Pom.hml :

<project ...>
    ...
    <artifactId>database</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>3.5.4-Final</version>
        </dependency>
    </dependencies>    
</project>

DAO :

public class AbstractDAO<T extends BaseEntity> implements GenericDAO<T> {


    private final Class<T> persistentClass;

    private EntityManager entityManager;

    public AbstractDAO(Class<T> entityClass) {
        super();
        this.persistentClass = entityClass;
    }

    @PersistenceContext
    public void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }


    public EntityManager getEntityManager() {
        return entityManager;
    }

    ...

    public void fooBar() {
       //Exception from this line
       Session session = getEntityManager().unwrap(Session.class);
       ...
    }

    ....

}

나는 Spring을 사용하는 모듈을 가지고있다.

Pom.hml :

<project ...>
...
<artifactId>api</artifactId>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    ....
</dependencies>

 ...    
</project>

AppContext.xml :

<bean id="authService" scope="singleton" class="com.test.management.AuthServiceImpl" />

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" name="EntityManagerFactory">
        <property name="persistenceUnitName" value="default"></property>
        <property name="dataSource" ref="dataSource"></property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="true" />
                <property name="databasePlatform" value="${db.dialect}" />
            </bean>
        </property>     
    </bean>

    <!-- Values are defined in db.properties -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${db.driver}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>

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

    <tx:annotation-driven />

    <bean id="userDAO" scope="singleton" class="com.test.database.dao.impl.UserDAOImpl">
    </bean>


    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

</beans> 

서비스:

public class AuthServiceImpl implements AuthService {

    @Autowired
    private UserDAO userDAO;


    @Override
    public void authorization() {
        userDAO.fooBar();

    }
}

EntityManager에서 세션을 가져 오려고 할 때이 예외가 발생합니다.

java.lang.IllegalStateException: No transactional EntityManager available
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
    at $Proxy121.unwrap(Unknown Source) 

해결법

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

    1.메소드를 @Transactional 주석으로 둘러싸 야합니다.

    메소드를 @Transactional 주석으로 둘러싸 야합니다.

    @Transactional
    public void fooBar() {
       //Exception from this line
       Session session = getEntityManager().unwrap(Session.class);
       ...
    }
    

    그리고 봄 @ xml 구성 파일 (txManager는 관리자의 ID)에서 다음 선언을 사용하여 @Transactional 처리를 사용 가능하게하십시오.

    <tx:annotation-driven transaction-manager="txManager" />
    
  2. ==============================

    2.이 시도 ?

    이 시도 ?

    entityManager=entityManager.getEntityManagerFactory().createEntityManager();
    Session session = (Session) entityManager.unwrap(Session.class);
    
  3. ==============================

    3.이 중 아무 것도 저에게 효과가 없었습니다. 마침내 문제는 내가 대신 @Transactional이라는 메서드를 만들고 있음을 알았습니다. 대신 @Transactional이 될 클래스가 필요했습니다.

    이 중 아무 것도 저에게 효과가 없었습니다. 마침내 문제는 내가 대신 @Transactional이라는 메서드를 만들고 있음을 알았습니다. 대신 @Transactional이 될 클래스가 필요했습니다.

  4. from https://stackoverflow.com/questions/14522691/java-lang-illegalstateexception-no-transactional-entitymanager-available by cc-by-sa and MIT license