Hibernate中获取Session的两种方式代码示例
session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期/事务的管理/数据库的存取都与session息息相关.
session对象是通过sessionfactory构建的,下面举个例子来介绍hibernate两种获取session的方式。
日志,是编程中很常见的一个关注点.用户在对数据库进行操作的过程需要将这一系列操作记录,以便跟踪数据库的动态.那么一个用户在向数据库插入一条记录的时候,就要向日志文件中记录一条记录,用户的一系列操作都要在一个session中进行,否则这就成为了两个线程.不能保证同步.看下面的代码
hibernateutil管理session的工具类
package com.bjpowernode.usermgr.util; import org.hibernate.session; //hibernate3的 import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; public class hibernateutils { private static sessionfactory factory; static{ try{ //读取hibernate.cfg.xml文件 configuration cfg=new configuration().configure(); //建立sessionfactory factory=cfg.buildsessionfactory(); } catch(exception e){ e.printstacktrace(); } } //获得开启着的session public static session getsession(){ return factory.opensession(); } //关闭session public static void closesession(session session){ if(session!=null){ if(session.isopen()){ session.close(); } } } public static sessionfactory getsessionfactory(){ return factory; } }
用户业务逻辑层
package com.bjpowernode.usermgr.manager; import java.util.date; import org.hibernate.session; import com.bjpowernode.usermgr.domain.log; import com.bjpowernode.usermgr.domain.user; import com.bjpowernode.usermgr.util.hibernateutils; public class usermanagerimpl implements usermanager { /** * 添加用户和添加日志都使用了同一个session,所以 * 当用户添加失败的时候,日志也会添加失败。事务回滚 * 用户添加成功日志也会添加成功 */ public void adduser(user user) { session session=null; try{ //取得当前线程session session=hibernateutils.getsessionfactory().getcurrentsession(); session.begintransaction(); //保存用户 session.save(user); log log=new log(); log.settype("操作日志"); log.settime(new date()); log.setdetail("xxx"); logmanager logmanager=new logmanagerimpl(); //保存日志 logmanager.addlog(log); session.gettransaction().commit(); } catch(exception e){ e.printstacktrace(); session.gettransaction().rollback(); } } }
日志实现类:
package com.bjpowernode.usermgr.manager; import org.hibernate.session; import com.bjpowernode.usermgr.domain.log; import com.bjpowernode.usermgr.util.hibernateutils; public class logmanagerimpl implements logmanager { public void addlog(log log) { //获取当前线程的session hibernateutils.getsessionfactory().getcurrentsession().save(log); } }
测试类
package com.bjpowernode.usermgr.manager; import junit.framework.testcase; import com.bjpowernode.usermgr.domain.user; public class usermanagerimpltest extends testcase { public void testadduser() { usermanager usermanager=new usermanagerimpl(); user user=new user();
user.setname("张三"); usermanager.adduser(user); }
注意:
1.opensession和getcurrentsession的区别?
*opensession必须关闭,currentsession在事务结束后自动关闭
*opensession没有和当前线程绑定,currentsession和当前线程绑定
2.如果使用currentsession需要在hibernate.cfg.xml文件中进行配置:
*如果是本地事务(jdbc事务)
<propertyname="hibernate.current_session_context_class">thread</property>
*如果是全局事务(jta事务)
<propertyname="hibernate.current_session_context_class">jta</property>
全局事务:资源管理器管理和协调的事务,可以跨越多个数据库和进程。资源管理器一般使用xa二阶段提交协议与“企业信息系统”(eis)或数据库进行交互。
本地事务:在单个eis或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。
总结
以上就是本文关于hibernate中获取session的两种方式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅:
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!