hibernate的事务管理和session对象的详解
//开启事务 transaction=session.beginTransaction();
上面为开启事务
transaction.commit();这个为提交事务
从session对象中获取事务后进行提交
下面可以自动提交事务,并且可以不需要对于这个事务进行提交,但是不推荐这样进行使用这个方法
session.doWork(new Work() { //这里的connection对象就是jdbc中的对象 @Override public void execute(Connection connection) throws SQLException { // TODO Auto-generated method stub connection.setAutoCommit(true);//设置自动提交事务 } });
在设置自动提交事务后必须对session进行刷新操作后才能有效
session.flush();//对于事务设成自动提交后需要对session进行刷新后才能使用
openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;如果不关闭会导致每次都打开一个connection对象,最后导致连接池溢出
getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 ;
一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;
如何获得session对象???
(1)openSessionion
(2)getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>
package cn.lonecloud.test; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import org.junit.Test; public class SessionTest { @Test public void TestOpenSession() { Configuration configuration = new Configuration().configure();// 获得配置文件对象 ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry();//获得服务注册对象 SessionFactory factory=configuration.buildSessionFactory(registry);//获得session工厂对象 Session session=factory.openSession();//获取session对象 if (session!=null) { System.out.println("Session 创建成功"); }else { System.out.println("Session 创建失败"); } } //在使用getCurrentSession的时候必须在cfg配置文件中进行配置 // <!--设置当前的session对象的类型thead为当前的jdbc的session对象 --> // <!-- 如果是本地事务(jdbc事务) --> // <property name="hibernate.current_session_context_class">thread</property> //<!-- 如果是全局事务(jta事务) // <property name="hibernate.current_session_context_class">jta</property> --> @Test public void TestCurrentSession(){ Configuration configuration = new Configuration().configure();// 获得配置文件对象 ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties()) .buildServiceRegistry();//获得服务注册对象 SessionFactory factory=configuration.buildSessionFactory(registry);//获得session工厂对象 Session session=factory.getCurrentSession();//获取session对象 if (session!=null) { System.out.println("Session 创建成功"); }else { System.out.println("Session 创建失败"); } } }