pring 3.x 和 Hibernate4.x 整合时遇到的No Session found for current thread问题的解决办法
大家都知道,Hibernate升级到4.x以后,在Spring中,通过Hibernate访问数据库的方法已经发生了变化,不再是以往让自己的DAO实现类继承HibernateDAOSupport,然后使用getHibernateTemplate()方法,操作数据库。新的模式下,只能通过从Spring注入的SessionFactory,使用Hibernate原生的方法,操作数据库。
解决方法:在Dao的实现类中,注入SessionFactory,然后通过SessionFactory的getCurrentSession()获取session对象,这样的session对象自动关闭。
但是需要注意两点:
1.要Hibernate中使用Session,需要在配置文件中申明事务。这种申明式事务的好处是,把事务的管理完全从业务程序中分离出来,作为一个可配置、可插拔的功能。程序中不再需要任何管理事务的代码,既可以完全实现事务处理的功能。这一点也正是体现了Spring面向方面编程的优越性。
<bean id="transactionManager"
class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 使用annotation声明 -->
<tx:annotation-driven transaction-manager="transactionManager" />
2.需要绑定线程
<bean id="sessionFactory"
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>
<!-- 配置这句可以使得getCurrentSession()生效 -->
<prop key="current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop>
</props>
</property>