[SPRING] java.lang.IllegalStateException : 사용할 수있는 트랜잭션 가능한 EntityManager가 없습니다.
SPRINGjava.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.메소드를 @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.이 시도 ?
이 시도 ?
entityManager=entityManager.getEntityManagerFactory().createEntityManager(); Session session = (Session) entityManager.unwrap(Session.class);
-
==============================
3.이 중 아무 것도 저에게 효과가 없었습니다. 마침내 문제는 내가 대신 @Transactional이라는 메서드를 만들고 있음을 알았습니다. 대신 @Transactional이 될 클래스가 필요했습니다.
이 중 아무 것도 저에게 효과가 없었습니다. 마침내 문제는 내가 대신 @Transactional이라는 메서드를 만들고 있음을 알았습니다. 대신 @Transactional이 될 클래스가 필요했습니다.
from https://stackoverflow.com/questions/14522691/java-lang-illegalstateexception-no-transactional-entitymanager-available by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 프리 플라이트에 대한 응답에 잘못된 HTTP 상태 코드 401이 있습니다. (0) | 2018.12.26 |
---|---|
[SPRING] HibernateException : 현재 스레드에 대해 트랜잭션 동기화 세션을 가져올 수 없습니다. (0) | 2018.12.26 |
[SPRING] java.lang.NoSuchMethodError : 자바 스크립트 숨겨진 기능은 무엇입니까? (0) | 2018.12.26 |
[SPRING] Spring 빈을 비 프로비저닝 할 수 있습니까? (0) | 2018.12.26 |
[SPRING] 파일을 MultiPartFile로 변환 (0) | 2018.12.26 |