1、最好是使用hibernate原生的session获取方法
不推荐使用 HibernateTemplate 和 HibernateDaoSupport,因为会导致hibernate(即当前DAO)和 Spring API 耦合,使代码不能再非spring环境下使用,降低代码的可重用性。
@Autowired
private SessionFactory sessionFactory;
//获取与当前线程绑定的sessionpublic Session getSession(){
return sessionFactory.getCurrentSession();
}
2、使用JUnit测试,getSession()的方法出现错误
|----Spring使用Junit测试必须导入spring-test-4.x.x.RELEASE.jar
|----在JUnit test类上面须有如下标签:
e.g.
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:applicationContext-beans.xml",
"classpath:applicationContext.xml"})//这里的.xml文件是spring的配置文件
public class UserDAOImplTest {
}
1、上述都确保正确后,还有java.lang.NullPointerException,使用debug查看SeeeionFactory是否注入成功;
![](https://img.haomeiwen.com/i2802381/b376d7cf2c1084b8.png)
如果红框为null,则注入失败,应该确定.xml或注解是否都已配置完整
注意如果有继承情况,如:
public class UserDAOImpl extends BaseDAOImpl implements UserDao{}
而SessionFactory在BaseDAOImpl中,一定不要忘了将为BaseDAOImpl配置bean或加上@Repository
同时确定sessionFactory是否被加上@Autowired(或在.xml被注入 )
2、如果获取到sessionFactory,但出现如下错误:
org.hibernate.HibernateException:
Could not obtain transaction-synchronized Session for current thread
原因:没有对测试方法开启任何事务
解决:当前测试类上加@Transactional,而且在spring配置文件ApplicationContext.xml中 使标签有效则可以解决这个问题。
原理:测试方法只是被调用,故没有对此方法进行任何处理,但是调用此方法的方法是事务性的,故在其上加上事务的配置即可,即此方法必须被包含进一个事务内。
具体过程是:
在事务开启之前 获取session-->将 session与当前线程绑定-->开启事务
若没有发生异常-->提交事务,解除绑定,关闭session
若发生异常-->回滚事务,解除绑定,关闭session
网友评论