对于getCurrentSession方法,Spring Hibernate“No Current Transaction”

时间:2014-06-20 05:05:15

标签: spring hibernate

我正在使用Spring配置来测试Spring-Hibernate Transactions。

<beans ...>

    <tx:annotation-driven  transaction-manager="transactionManager"/>

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

    <!--  hibernate 4 onwards annotationsessionfactorybean is replaced with localsessionfactory bean -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.fg.arch.test.transaction.Foo</value>
            </list>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.current_session_context_class">thread</prop>
                <!-- <prop key="hibernate.current_session_context_class">org.hibernate.context.internal.ThreadLocalSessionContext</prop> -->
            </props>
        </property>
    </bean>
</beans>

我的服务图层使用@Transactional注释。

这是我的DAO:

public class FooHibernateDaoImpl implements FooDao {

    private SessionFactory sessionFactory;  

    public void testFoo(Foo foo) throws Throwable {
        System.out.println(" --- ");
        sessionFactory.openSession().save(foo);     
    }
    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
}

使用openSession()方法明确打开会话不会导致问题,但是当我更改为getCurrentSession()时,我会收到异常。

我有两个问题。

  1. 在每个DAO方法中调用openSession()是一种好习惯。
  2. 如何使getCurrentSession()工作,以便它不会给我一个例外,例如没有活动交易?
  3. 感谢。

1 个答案:

答案 0 :(得分:2)

回答你的问题:

  1. 不,不是。应该在调用@Transactional的服务类方法上的testFoo()注释正在为您打开会话。您应该在DAO中使用getCurrentSession()来获得此会话。

  2. 你可以,但你不应该。这就是使用基于注释的事务管理的Hibernate SessionFactory的全部要点。只要您将服务方法标记为交易方式,就不会有问题。

  3. 作为旁注,为什么不自动装配SessionFactory?不要使用setter设置应该自动装配的东西。否则你也可以不使用Spring。