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>
* 如果使用的是本地事务(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);
}
@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);
}
}
}
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
,如需转载请自行联系原作者