Hibernate框架中利用Configuration对象的buildSessionFactory()可以得到一个SessionFactory的对象,顾名思义SessionFactory就是产生Session对象的工厂,而它产生Session的方法有两种:
1.openSession();
2.getCurrentSesion()
由于在很多面试题中有考察到这个知识点,所以我总结了一下这两种产生Session方法的区别。
区别1.openSession()方法无论在上下文中有没有Session存在都会建一个新的Session,而getCurrentSession()方法会检测在上下文环境中是否有Session存在,如果有,则拿到这个Session;如果没有则创建一个新的Session。
区别2.openSession()方法创建的Session在最后必须调用close()方法,而getCurrentSession()方法创建的Session在调用commit()方法后无需再调用close()方法(最好不要调用,会产生不必要的错误)。
区别3.getCurrentSession()方法的用途是界定事物边界。
Ps:在一次测试中发现当先调用openSession()方法产生Session后,再调用getCurrentSession()方法得到的并不是之前产生的那个Session,而是一个新的Session。
解释一下上面所提到的上下文,这里所说的上下文是在hibernate.cfg.xml中指定的,其中有两个常用的取值,分别是thread和jta。这两者的区别在于thread适用于单Connection,他的事物由数据库连接Connection管理;而jta适用于多Connection(跨数据库)的分布式程序(当然单Connection也可以),他的事物由application server提供的专门的事物管理器来管理。