Hibernate中openSession 和 getCurrentSession

Hibernate中openSession 和 getCurrentSession


开发中,使用MyEclipse自动生成的Hibernate DAO类中在对session的获取中,都使用的getSession(MyEclipse8.5之前的版本都是如此)。

首先要说明一下这3个方法:

1、openSession 和 getCurrentSession这两个方法是 Hibernate中的sessionFactory中的方法。要获取session只能通过这两个方法获取。

2、getSession这个方法是使用MyEclipse的Hibernate工具时自动生成的方法。进入方法里查看:

 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;
    }

很明显,Myeclipse使用的是openSession。所以上述的3个方法,其实也就是openSession和getCurrentSession的区别。

这里简单说明一下openSession 和 getCurrentSession这两个方法的区别。很容易看出来,openSession每次都是创建一个新的session,而getCurrentSession会查看,如果当前上下文中已经有Session,则直接使用原有的,否则会创建一个新的session。

当然这样说并不是很形象。很多人会理解为,后面一个只是前面的略微优化而已,每次都打开新的也不会出错。当然这样理解并没有完全错误,其实这里的Session使用上没有很大的区别,区别是在于使用openSession时,如果涉及到对数据库的数据的修改(增、删、改),在事务提交之后,session必须手动关闭(session.close()),否则会出错,一般是数据已经保存进数据库,但使用Hibernate再次查询数据时并没有显示新的值。而getCurrentSession在事务提交后会自动关闭当前session。

所以,一般推荐使用getCurrentSession,这样需要我们关心的内容就更少,而且更不容易出错。

当然,MyEclipse也不会放着高级的东西不用的,仔细查看上面的代码,发现在openSession之前,session会先从threadLocal中获取,这里的threadLocal就可以类比为getCurrentSession中配置的thread,所以,可以认为MyEclipse是在openSession之前已经实现了从线程中获取上下文的Session,所以直接使用MyEclipse生成的getSession的功能类似getCurrentSession,但是测试后发现,getSession在提交事务之后,并没有自动关闭,仍然需要手动关闭。

为什么MyEclipse不使用getCurrentSession呢?查看生成的DAO类可以发现,MyEclipse生成的是没有和事务相关的操作的,当然在进行save、update、delete操作时必须手动添加事务开始和事务提交,所以这里在提交事务之后必须手动关闭session。而进行数据库查找操作时,openSession是不需要提交事务的。

getCurrentSession则必须要打开一个新的事务,否则会报createQuery is not valid without active transaction错误。

从简化操作的角度,直接使用MyEclipse的方法更为简单,但要记住增删改操作必须手动添加事务,并在操作结束后关闭session。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值