在整合hibernate与spring的过程中,遇到了这个问题,困扰了我很久!!今天终于给解决了,记录下!
开始的时候,在我的BaseDaoImpl类里,对于session的获取我是直接通过注解,得到工厂调用的,于是就一直报如下的错误:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here,代码如下。
<span style="white-space:pre"> </span>@Resource
private SessionFactory sf ;
public void saveEntity(T t) {
sf.getCurrentSession().save(t);
}
在网上找了很多关于这方面的解决方法,常见的一种就是在使用getCurrentSession()的时候,session是还没有打开的,是拿当前的session,并且一直是这个session,可以通过底层代码知道 :
<span style="white-space:pre"> </span>private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
<pre name="code" class="java"><span style="white-space:pre"> </span>public static Session getSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
所以在使用这个方法的时候要先打开session,网上看到的方法是在hibernate.cfg.xml中加入定制:
<span style="white-space:pre"> </span><property name="hibernate.current_session_context_class">thread</property>
但是对于这种解决方法我不使用,使用的话,会报另一种错误!
之后,我尝试着使用openSession()的方法,但是,在执行单元测试插入语句的时候,会报不能save的错误,这个方法也行不通。
接着,我又尝试了在applicationContext.xml文件中配置上:
<!-- 使用annotation定义事务 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
这个方法请参考:<a target=_blank href="http://www.iteye.com/problems/73211">参考方法链接</a>
关注注解的问题!但是还是没解决。
最后,看了相关的解答,我尝试了下使用HibernateTemplate接口:
<span style="white-space:pre"> </span>@Transactional
public void saveEntity(T t) {
HibernateTemplate hibernateTemplate = new HibernateTemplate(sf);
hibernateTemplate.save(t);
}
对于这个接口我不熟悉,尝试用了下,结果成功了!!但是还是有很大的疑惑:
hibernateTemplate 是类似于session还是说就是session?于是我百度了下:
getHibernateTemplate()方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接。
在实际的使用过程中发现的确getHibernateTemplate()比getSession()方法要好很多,但是有些方法在getHibernateTemplate()并没有提供,这时我们用 HibernateCallback 回调的方法管理数据库.链接
至此,问题解决!!当解决了一个问题的时候,又出现了新的错误,好烦!!但是还是得耐心的找下去,在此也谢谢网上的各位大神提供的帮助~