Hibernate中获取Session的两种方式代码示例
Session:是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久层操作的基础.对象的生命周期/事务的管理/数据库的存取都与Session息息相关.
Session对象是通过SessionFactory构建的,下面举个例子来介绍Hibernate两种获取session的方式。
日志,是编程中很常见的一个关注点.用户在对数据库进行操作的过程需要将这一系列操作记录,以便跟踪数据库的动态.那么一个用户在向数据库插入一条记录的时候,就要向日志文件中记录一条记录,用户的一系列操作都要在一个Session中进行,否则这就成为了两个线程.不能保证同步.看下面的代码
HibernateUtil管理Session的工具类
packagecom.bjpowernode.usermgr.util;
importorg.hibernate.Session;
//hibernate3的
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassHibernateUtils{
privatestaticSessionFactoryfactory;
static{
try{
//读取hibernate.cfg.xml文件
Configurationcfg=newConfiguration().configure();
//建立SessionFactory
factory=cfg.buildSessionFactory();
}
catch(Exceptione){
e.printStackTrace();
}
}
//获得开启着的Session
publicstaticSessiongetSession(){
returnfactory.openSession();
}
//关闭Session
publicstaticvoidcloseSession(Sessionsession){
if(session!=null){
if(session.isOpen()){
session.close();
}
}
}
publicstaticSessionFactorygetSessionFactory(){
returnfactory;
}
}
用户业务逻辑层
packagecom.bjpowernode.usermgr.manager;
importjava.util.Date;
importorg.hibernate.Session;
importcom.bjpowernode.usermgr.domain.Log;
importcom.bjpowernode.usermgr.domain.User;
importcom.bjpowernode.usermgr.util.HibernateUtils;
publicclassUserManagerImplimplementsUserManager{
/**
*添加用户和添加日志都使用了同一个Session,所以
*当用户添加失败的时候,日志也会添加失败。事务回滚
*用户添加成功日志也会添加成功
*/
publicvoidaddUser(Useruser){
Sessionsession=null;
try{
//取得当前线程Session
session=HibernateUtils.getSessionFactory().getCurrentSession();
session.beginTransaction();
//保存用户
session.save(user);
Loglog=newLog();
log.setType("操作日志");
log.setTime(newDate());
log.setDetail("XXX");
LogManagerlogManager=newLogManagerImpl();
//保存日志
logManager.addLog(log);
session.getTransaction().commit();
}
catch(Exceptione){
e.printStackTrace();
session.getTransaction().rollback();
}
}
}
日志实现类:
packagecom.bjpowernode.usermgr.manager;
importorg.hibernate.Session;
importcom.bjpowernode.usermgr.domain.Log;
importcom.bjpowernode.usermgr.util.HibernateUtils;
publicclassLogManagerImplimplementsLogManager{
publicvoidaddLog(Loglog){
//获取当前线程的Session
HibernateUtils.getSessionFactory().getCurrentSession().save(log);
}
}
测试类
packagecom.bjpowernode.usermgr.manager;
importjunit.framework.TestCase;
importcom.bjpowernode.usermgr.domain.User;
publicclassUserManagerImplTestextendsTestCase{
publicvoidtestAddUser(){
UserManageruserManager=newUserManagerImpl();
Useruser=newUser();
user.setName("张三");
userManager.addUser(user);
}
注意:
1.openSession和getCurrentSession的区别?
*openSession必须关闭,currentSession在事务结束后自动关闭
*openSession没有和当前线程绑定,currentSession和当前线程绑定
2.如果使用currentSession需要在hibernate.cfg.xml文件中进行配置:
*如果是本地事务(jdbc事务)
*如果是全局事务(jta事务)
全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用XA二阶段提交协议与“企业信息系统”(EIS)或数据库进行交互。
本地事务:在单个EIS或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
总结
以上就是本文关于Hibernate中获取Session的两种方式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅:
hibernate通过session实现增删改查操作实例解析
快速了解Hibernate中的Session
Hibernate使用hbm.xml配置映射关系解析
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!