org.hibernate.HibernateException:找不到当前线程的会话,使用tx:advise

时间:2014-05-14 18:11:29

标签: java spring hibernate spring-mvc

我使用spring 3.2和hibernate 4.我想用spring来控制事务。 但是,通过下面提到的配置,我得到了

用于servlet spring的Servlet.service()抛出异常:org.hibernate.HibernateException:找不到当前线程的会话'

异常:

<aop:config>
    <aop:pointcut id="serviceMethods"
        expression="execution(* com.locator.service.impl.ServiceTypeService.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
</aop:config>

<tx:advice id="txAdvice" transaction-manager="hbTransactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<!-- Hibernate session factory -->
<bean id="hbSessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource">
        <ref bean="dataSource" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>

    <property name="mappingResources">
        <list>
            <value>../spring/model/ServiceType.hbm.xml</value>
        </list>
    </property>

</bean>

<bean id="hbTransactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="hbSessionFactory" />
</bean>

<bean id="serviceTypeService" class="com.locator.service.impl.ServiceTypeService">
    <property name="serviceTypeDao" ref="serviceTypeDao"></property>
</bean>

<bean id="serviceTypeDao" class="com.locator.dao.impl.ServiceTypeDao">
    <property name="sessionFactory" ref="hbSessionFactory"></property>
</bean>

Dao层和服务的代码如下:

public class ServiceTypeDao implements IServiceTypeDao{

    private static final Log log = LogFactory.getLog(ServiceTypeDao.class);

    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory(){
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory){
        this.sessionFactory = sessionFactory;
    }

    public ServiceType findById(int id) {
        log.debug("getting ServiceType instance with id: " + id);
        try {
            Session session = getSessionFactory().getCurrentSession();
            ServiceType instance = (ServiceType)  session.get("com.locator.model.ServiceType", id);
            if (instance == null) {
                log.debug("get successful, no instance found");
            } else {
                log.debug("get successful, instance found");
            }

            instance.setName(instance.getName()+"0");
            session.saveOrUpdate(instance);

            return instance;
        }catch (RuntimeException re) {
            log.error("get failed", re);
            throw re;
        }
    }
}


public class ServiceTypeService implements IServiceTypeService{

    private ServiceTypeDao serviceTypeDao;

    public void setServiceTypeDao(ServiceTypeDao serviceTypeDao){
        this.serviceTypeDao = serviceTypeDao;
    }

    public ServiceType getServiceTypeById(int id){
        return serviceTypeDao.findById(id);
    }
}

用getSessionFactory()替换getSessionFactory()。getCurrentSession()。openSession()将解决上述问题,但这意味着开发人员将负责会话打开/关闭而不是弹簧。因此,请告知如何使用弹簧解决这个问题。

1 个答案:

答案 0 :(得分:0)

我能够解决这个问题。它是由于以下问题而发生的:

  1. Service类未自动连接到控制器,即@Autowired注释丢失。
  2. 必须使用侦听器类'org.springframework.web.context.ContextLoaderListener'修改web.xml的配置,并添加了context-param。