java.lang.IllegalStateException:没有事务性的EntityManager可用 [英] java.lang.IllegalStateException: No transactional EntityManager available
问题描述
pom.xml:
< project ...>
...
< artifactId>数据库< / artifactId>
<依赖关系>
< dependency>
< groupId> org.hibernate< / groupId>
< artifactId> hibernate-entitymanager< / artifactId>
< version> 3.5.4-最终< / version>
< /依赖关系>
< /依赖关系>
< / project>
DAO:
public class AbstractDAO< T extends BaseEntity>实现GenericDAO< T> {
private final Class< T>对PersistentClass;
私人EntityManager entityManager;
$ b $ public public AbstractDAO(Class< T> entityClass){
super();
this.persistentClass = entityClass;
}
@PersistenceContext
public void setEntityManager(EntityManager entityManager){
this.entityManager = entityManager;
}
public EntityManager getEntityManager(){
return entityManager;
$ b public void fooBar(){
//此行的异常
Session session = getEntityManager() .unwrap(Session.class);
...
}
....
我有一个使用Spring的模块。
pom.xml:
< project ...>
...
< artifactId> api< / artifactId>
<依赖关系>
< dependency>
< groupId> org.springframework< / groupId>
< artifactId> spring-core< / artifactId>
< version> $ {spring.version}< / version>
< /依赖关系>
< dependency>
< groupId> org.springframework< / groupId>
< artifactId> spring-context< / artifactId>
< version> $ {spring.version}< / version>
< /依赖关系>
< dependency>
< groupId> org.springframework< / groupId>
< artifactId> spring-orm< / artifactId>
< version> $ {spring.version}< / version>
< /依赖关系>
....
< /依赖关系>
...
< / project>
AppContext.xml:
< bean id =authServicescope =singletonclass =com.test.management.AuthServiceImpl/>
< bean id =entityManagerFactoryclass =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBeanname =EntityManagerFactory>
< property name =persistenceUnitNamevalue =default>< / property>
< property name =dataSourceref =dataSource>< / property>
< property name =jpaVendorAdapter>
< bean class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter>
< property name =showSqlvalue =true/>
< property name =generateDdlvalue =true/>
< property name =databasePlatformvalue =$ {db.dialect}/>
< / bean>
< / property>
< / bean>
<! - 值在db.properties中定义 - >
< bean id =dataSourceclass =org.apache.commons.dbcp.BasicDataSourcedestroy-method =close>
< property name =driverClassNamevalue =$ {db.driver}/>
< property name =urlvalue =$ {db.url}/>
< property name =usernamevalue =$ {db.username}/>
< property name =passwordvalue =$ {db.password}/>
< / bean>
< bean id =transactionManagerclass =org.springframework.orm.jpa.JpaTransactionManagername =TransactionManager>
< property name =entityManagerFactoryref =entityManagerFactory>< / property>
< / bean>
< tx:annotation-driven />
< bean id =userDAOscope =singletonclass =com.test.database.dao.impl.UserDAOImpl>
< / bean>
< bean class =org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor/>
< / beans>
服务:
public class AuthServiceImpl implements AuthService {
$ b $ @Autowired
private UserDAO userDAO;
@Override
public void authorization(){
userDAO.fooBar();
$ b当我试图获得来自EntityManager的会话,我发现了这个异常: java.lang.IllegalStateException:没有事务性EntityManager可用
at org .springframework.orm.jpa.SharedEntityManagerCreator $ SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
at $ Proxy121.unwrap(Unknown Source)
解决方案您必须使用@Transactional注解来包围该方法:
@Transactional
public void fooBar(){
//此行的异常
Session session = getEntityManager()。unwrap(Session.class);
...
}
并启用spring @Transactional处理在你的spring的xml配置文件中声明下面的代码(txManager是你的管理器的id)。
< tx:annotation-driven transaction-manager =txManager/>
Project use Hibernate (JPA), Spring and Maven. My entity and DAO in a separate JAR.
pom.xml:
<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);
...
}
....
}
I have a module, which use Spring.
pom.xml:
<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>
Service:
public class AuthServiceImpl implements AuthService {
@Autowired
private UserDAO userDAO;
@Override
public void authorization() {
userDAO.fooBar();
}
}
When I'm trying to get the session from EntityManager, I catch this exception:
java.lang.IllegalStateException: No transactional EntityManager available
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:223)
at $Proxy121.unwrap(Unknown Source)
解决方案 You must surround the method with the @Transactional annotation:
@Transactional
public void fooBar() {
//Exception from this line
Session session = getEntityManager().unwrap(Session.class);
...
}
And enable the spring @Transactional processing with the following declaration in your spring's xml configuration file (txManager is the id of the your manager).
<tx:annotation-driven transaction-manager="txManager" />
这篇关于java.lang.IllegalStateException:没有事务性的EntityManager可用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!