Hibernate有两种方式获得session,分别是:
openSession和getCurrentSession
他们的区别在于
1. 获取的是否是同一个session对象
openSession每次都会得到一个新的Session对象
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象
因为是不同的session,所以肯定会返回false
在同一个线程中使用getCurrentSession
考虑一下为什么equals就返回false了?
getCurrentSession第一次得到的是一把钥匙(放在堆里),指向一个session(放在栈里);第二次得到的是第一把钥匙的复制品(放在堆里),这两把钥匙并不是同一把,equals比较的就是这两把钥匙到底是否相同,结果为false;而这两把钥匙都指向同一个session,==比较的是这两把钥匙指向的session是否相同,结果为true
在不同线程里比较:
2. 事务提交的必要性
openSession只有在增加,删除,修改的时候需要事务,查询时不需要的
getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
因为getCurrentSession()本意就是获取当前事务中的session,如果没有事务,你从哪里获取session