hibernate中取得session的两种方式

来源:互联网 发布:淘宝一元拍在哪里 编辑:程序博客网 时间:2024/06/04 19:50

<PRE class=java name="code" sizcache="1" sizset="2"><PRE class=javascript name="code">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);
    }
  }
}</PRE><BR>
<BR>
<PRE></PRE>
<PRE></PRE>

</PRE>