java.lang.IllegalStateException:没有事务性的EntityManager可用 [英] java.lang.IllegalStateException: No transactional EntityManager available

查看:589
本文介绍了java.lang.IllegalStateException:没有事务性的EntityManager可用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

项目使用Hibernate(JPA),Spring和Maven。我的实体和DAO在单独的JAR中。



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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆