我们一开始用session都用HibernateUtil工具类获得Session对象,因为该工具类可以保证将线程不安全的Session绑定到当前线程内,但每次返回的对象都是一个新的session,我写了一个测试方法如下:
@Testpublic void test() {Session s1 = HibernateUtils.openSession();Session s2 = HibernateUtils.openSession();if(s1 == s2) {System.out.println("true");}else {System.out.println("false");}}
输入结果如下:
在Hibernate3开始,Hibernate增加了SessionFactory.getCurrentSession();方法,该方法可以直接获取当前线程的Session对象,而且每次返回的都是同一个对象,下面是配置步骤,首先,我们在hibernate.cfg.xml写入如下代码:
<!-- 把session和线程绑定,从而实现一个线程只有一个Session --><property name="hibernate.current_session_context_class">thread</property>
这个时候就配置好了,下面我们写一个测试方法来测试一下吧:
@Testpublic void test() {Session s1 = HibernateUtils.getCurrentSession();Session s2 = HibernateUtils.getCurrentSession();if(s1==s2) {System.out.println("true");}}
下面这个代码就是获取当前线程的session,我将它封装到HibernateUtils类里面了
Session s1 = HibernateUtils.getCurrentSession()
具体代码如下:
public static Session getCurrentSession() {//只有配置了把session和线程绑定之后,才能使用此方法,否则返回值为nullreturn factory.getCurrentSession();}
这个时候我们在运行一下:
发现输出结果为true,说明返回的是同一个对象
注:Hibernate的Session会随着getCurrentSession()方法自动打开,并伴随事物的·提交自动关闭,非常方便