hibernate中取得session的两种方式

简介:
Hibernate用SessionFactory提供session,并且SessionFactory提供了两种取得session的方法:getCurrentSession()和openSession()。
 
1.getCurrentSession()和openSession()的区别:
   1>.采用getCurrentSession()创建的session会绑定到当前线程中,即getCurrentSession会取得当前线程中已绑定的session,如果没有,则新建一个session并绑定到线程中。这样,保证了一个线程中各个业务方法使用的都是同一个线程,在编程式事务编程中省去了session的传递,是很方便的。而采用openSession()创建的session则只会新建session。
 
   2>.getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭。
 
2.使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
 * 如果使用的是本地事务(jdbc事务)
 <property name="hibernate.current_session_context_class">thread</property>
 * 如果使用的是全局事务(jta事务)
 <property name="hibernate.current_session_context_class">jta</property>
 
LogDaoImpl.java
public  class LogDaoImpl  implements LogDao { 
  @Override 
   public  void addLog(Log log, Session session) { 
    session.save(log); 
  }
测试类:
public  class test1 { 
   public  static  void main(String[] args) { 
/*    User user = new User();// 
    user.setName("sili3"); 
    addUser(user);*/
 
     
    User user2 =  new User(); 
    user2.setName( "wangwu4"); 
    addUserCurrent(user2); 
  } 

   /** 
    * 1.有异常发生,session还没有提交就在catch里回滚,故user插入不成功。log根本没有提交语句,也插入不成功 
    * 2.无异常发生,session提交,故user插入成功。log根本没有提交语句,也插入不成功。 
    *        说明他们用的不是同一个session 
    * @param user 
    */
 
   public  static  void addUser(User user) { 
    Session session =  null
    LogDao logDao =  new LogDaoImpl(); 
     try { 
      session = HibernateUtils.getCurrentSession(); 
      session.beginTransaction(); 
      session.save(user); 

      Log log =  new Log(); 
      log.setType( "操作日志"); 
      log.setDetail(user.getName() +  "录入系统"); 
      log.setTime( new Date()); 
      logDao.addLog(log, HibernateUtils.getSession()); //要保证addUser和addLog使用通一个session,才能保证他们在一个事务中 
       //System.out.println(9/0); 
      session.getTransaction().commit(); 
        
    }  catch (Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }  finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 

   /** 
    * 1.无//System.out.println(9/0);,没发生异常,只有session的事务提交,user和log都能插入成功。 
    *     说明他们用的是一个session 
    * 2.有System.out.println(9/0);发生异常,session回滚,user和log都插不进去。 
    *     也说明他们用的是一个session 
    * @param user 
    */
 
   public  static  void addUserCurrent(User user) { 
    Session session =  null
    LogDao logDao =  new LogDaoImpl(); 
     try { 
      session = HibernateUtils.getCurrentSession(); 
      session.beginTransaction(); 
      session.save(user); 

      Log log =  new Log(); 
      log.setType( "操作日志"); 
      log.setDetail(user.getName() +  "录入系统"); 
      log.setTime( new Date()); 
      logDao.addLog(log, HibernateUtils.getCurrentSession()); //要保证addUser和addLog使用通一个session,才能保证他们在一个事务中 
       //System.out.println(9/0); 
      session.getTransaction().commit(); 
        
    }  catch (Exception e) { 
      e.printStackTrace(); 
      session.getTransaction().rollback(); 
    }  finally { 
      HibernateUtils.closeSession(session); 
    } 
  } 
}

     本文转自NightWolves 51CTO博客,原文链接: http://blog.51cto.com/yangfei520/253745 ,如需转载请自行联系原作者


相关文章
|
4月前
|
缓存 安全 Java
|
4月前
|
缓存 安全 Java
Hibernate 中的 Session 是线程安全的吗?
【8月更文挑战第21天】
51 0
|
4月前
|
缓存 安全 Java
Hibernate 中的 Session 是什么?
【8月更文挑战第21天】
57 0
|
7月前
|
SQL 缓存 Java
Hibernate - Session管理与批量数据处理详解
Hibernate - Session管理与批量数据处理详解
92 0
|
7月前
|
存储 缓存 Java
Hibernate - Session方法与持久化对象详解
Hibernate - Session方法与持久化对象详解
164 0
|
7月前
|
SQL 缓存 Java
Hibernate - SessionFactory和Session详解
Hibernate - SessionFactory和Session详解
151 0
|
SQL Java 数据库连接
Hibernate中的Session对象
Hibernate中的Session对象
92 0
|
关系型数据库 MySQL Java
Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionExcep linux下mysql修改连接超时wait_timeout修改后就ok了
191 1
|
XML 存储 SQL
问:hibernate的sessionfactory是干嘛的?session又是干嘛的呢?
问:hibernate的sessionfactory是干嘛的?session又是干嘛的呢?
103 1
hibernate4 could not initialize proxy - no Session
hibernate4 could not initialize proxy - no Session