Spring整合Hibernate关于getSession()问题

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是否注入成功;

成功注入效果

如果红框为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

你可能感兴趣的:(Spring整合Hibernate关于getSession()问题)