hibernate读取配置文件创建sessionBuildFactory后可以通过如下两种方式建立session
(1)openSession()
此方法每次会生成一个新session
如下测试后返回false,说明两次生成的session不是同一个session
@Test public void testOpenSession(){ Session session1 = sf.openSession(); Session session2 = sf.openSession(); System.out.println(session1==session2); }
注意:每次opensession执行后需要手动关闭session
(2) getCurrentSession()
此方法从上下文中获取session,如果上下文中没有,则自动生成一个session
如下执行后,前一个返回true,后一个返回false
@Test public void testGetCurSession(){ Session session1 = sf.getCurrentSession(); Session session2 = sf.openSession(); Session session3 = sf.getCurrentSession(); System.out.println(session1==session2); System.out.println(session3==session2);
如下测试后返回true,说明两次生成的session不是同一个session
常见的上下文有thread和JTA,在hibernate.cfg.xml中配置
<!-- Enable Hibernate's automatic session context management --> <property name="current_session_context_class">thread</property>
thread :即从当前线程中获取。
JTA : 管理分布式数据库
实际在应用中,一般用getCurrentSession()来界定事务边界,openSession()产生多个session不在一个事务中,难以界定。
除此外,getCurrentSession()中session提交后会自动关闭,手动关闭会报错
而openSession()必须手动关闭。