Hibernate中两种获取Session的方式
转自:https://www.jb51.net/article/130309.htm
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的方式的更多相关文章
- Hibernate中两种删除用户的方式
第一种,是比较传统的,先根据主键列进行查询到用户,在进行删除用户 //删除数据 public void deleteStudent(String sno) { init() ; Student qu ...
- 两种获取connectionString的方式
两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...
- OC中两种单例实现方式
OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...
- JavaScript中几种 获取元素的方式
1.根据id获取元素 document.getElementById("id属性的值"); 2.根据标签名字获取元素 document.getElementsByTagName(& ...
- AppCan中两种获取信息的方法
<div id="newsInfo">正在加载...</div> 1.JSON格式: [{'R': '1','NOTI_ID': '9','NOTI_TIT ...
- java中几种获取项目路径方式
转自http://caodaoxi.iteye.com/blog/1234805 在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录 ...
- java(JSP)中几种获取项目路径方式
在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getPro ...
- spring&pom两种获取profile的方式
一.原理: 1.实现ApplicationContextAware(当一个类实现了ApplicationContextAware这个接口之后,这个类就可以通过setApplicationContext ...
- hadoop中两种上传文件方式
记录如何将本地文件上传至HDFS中 前提是已经启动了hadoop成功(nodedate都成功启动) ①先切换到HDFS用户 ②创建一个user件夹 bin/hdfs dfs -mkdir /user ...
随机推荐
- 迈出从3K到1W的重要一步——掌握设计模式
IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝:而自己加班加点搞到天亮还做不完. 为什么用户提出需求变更后,大牛只需潇洒地敲敲键盘,改改配置:而自 ...
- php执行超时(nginx,linux环境)
与下面的参数有关 nginx: fastcgi_connect_timeout fastcgi_read_timeout fastcgi_send_timeout php-fpm:request_te ...
- transition、animation在macbook air上图片动画边缘抖动2
示例: BUG描述: 最近同事一项目中,产品提出在macbook air上,列表图片放大效果边缘出现抖动现象.在retina屏上没有此问题. 调试过程: 1.单独把结构分离.确定是否由其他元素引起. ...
- 求菲波那契数列的第n个数
1,2,3,5,8,13..... 求第n个数 def get_num(n): if n == 1: return 1 if n == 2: return 2 return get_num(n - 1 ...
- Mecanim动画编辑器 - 加入动画层实现并行动作
1.创建新的状态层 a) 通过下图的1button创建一个新的层 b) 通过下图2属性设置图层的权重.假设为0,则该图层的状态不会影响到总的状态机 c) Mask是设置动画的Avatar的关联节 ...
- vue2.0 自定义过滤器(filter)实例
一.过滤器简介 (1)过滤器创建 过滤器的本质 是一个有参数 有返回值的方法 new Vue({ filters:{ myCurrency:function(myInput){ return 处理后的 ...
- Collection接口和Collections类的简单区别和讲解
这里仅仅进行一些简单的比较,如果你想要更加详细的信息话,请自己百度. 1.Collection: 是集合类的上层接口.本身是一个Interface,里面包含了一些集合的基本操作. Collection ...
- activity栈管理的3种方式
一.背景 在android开发过程最经常使用的组件非activity莫属. 通过分析activity的各种跳转,执行同学能够分析用户的各种行为.更重要的一点是在做插件化的过程中,我们经常会对activ ...
- exists用在linq上
SQL里面,有时候会用到exists或者not exists. select * from yb t1 where not exists(select 1 from yb t2 where trunc ...
- 简单的shell脚本编写
http://www.cnblogs.com/wuyuegb2312/p/3399566.html