Hibernate中两种获取Session的方式

转自:https://www.jb51.net/article/130309.htm 

Session:是应用程序与数据库之间的一个会话,hibernate运作的中心,持久层操作的基础.对象的生命周期/事务的管理/数据库的存取都与Session息息相关.

  Session对象是通过SessionFactory构建的,下面举个例子来介绍Hibernate两种获取session的方式。

  日志,是编程中很常见的一个关注点.用户在对数据库进行操作的过程需要将这一系列操作记录,以便跟踪数据库的动态.那么一个用户在向数据库插入一条记录的时候,就要向日志文件中记录一条记录,用户的一系列操作都要在一个Session中进行,否则这就成为了两个线程.不能保证同步.看下面的代码

     HibernateUtil管理Session的工具类

  

  1. package com.bjpowernode.usermgr.util;  
  2.   
  3. import org.hibernate.Session;//hibernate3的  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.cfg.Configuration;  
  6.   
  7. public class HibernateUtils {  
  8.    private static SessionFactory factory;  
  9.       
  10.    static{  
  11.            try{  
  12.             //读取hibernate.cfg.xml文件  
  13.             Configuration cfg=new Configuration().configure();  
  14.                
  15.             //建立SessionFactory  
  16.             factory=cfg.buildSessionFactory();  
  17.      
  18.            }catch(Exception e){  
  19.               e.printStackTrace();   
  20.            }  
  21.    }    
  22.      
  23.       //获得开启着的Session  
  24.    public static Session getSession(){  
  25.        return factory.openSession();  
  26.    }  
  27.      
  28.       //关闭Session  
  29.    public static void closeSession(Session session){  
  30.        if(session!=null){  
  31.            if(session.isOpen()){  
  32.                session.close();  
  33.            }  
  34.        }  
  35.    }  
  36.      
  37.    public static SessionFactory getSessionFactory(){  
  38.        return factory;  
  39.    }  
  40. }  
  1. 用户业务逻辑层  
  2. package com.bjpowernode.usermgr.manager;  
  3.   
  4. import java.util.Date;  
  5.   
  6. import org.hibernate.Session;  
  7.   
  8. import com.bjpowernode.usermgr.domain.Log;  
  9. import com.bjpowernode.usermgr.domain.User;  
  10. import com.bjpowernode.usermgr.util.HibernateUtils;  
  11.   
  12. public class UserManagerImpl implements UserManager {  
  13.   
  14.       /** 
  15.     * 添加用户和添加日志都使用了同一个Session,所以 
  16.     * 当用户添加失败的时候,日志也会添加失败。事务回滚 
  17.     * 用户添加成功日志也会添加成功 
  18.     */  
  19.     public void addUser(User user) {  
  20.           
  21.         Session session=null;  
  22.         try{  
  23.             //取得当前线程Session  
  24.             session=HibernateUtils.getSessionFactory().getCurrentSession();  
  25.             session.beginTransaction();  
  26.               
  27.             //保存用户  
  28.             session.save(user);  
  29.               
  30.             Log log=new Log();  
  31.             log.setType("操作日志");  
  32.             log.setTime(new Date());  
  33.             log.setDetail("XXX");  
  34.               
  35.             LogManager logManager=new LogManagerImpl();  
  36.             //保存日志  
  37.             logManager.addLog(log);  
  38.               
  39.             session.getTransaction().commit();  
  40.               
  41.         }catch(Exception e){  
  42.             e.printStackTrace();  
  43.             session.getTransaction().rollback();  
  44.         }  
  45.     }  
  46.   
  47. }  
  48.   
  49. 日志实现类:  
  50. package com.bjpowernode.usermgr.manager;  
  51.   
  52. import org.hibernate.Session;  
  53.   
  54. import com.bjpowernode.usermgr.domain.Log;  
  55. import com.bjpowernode.usermgr.util.HibernateUtils;  
  56.   
  57. public class LogManagerImpl implements LogManager {  
  58.   
  59.   
  60.     public void addLog(Log log) {  
  61.           
  62.         //获取当前线程的Session  
  63.         HibernateUtils.getSessionFactory().getCurrentSession().save(log);  
  64.   
  65.     }  
  66.   
  67. }  
  68.   
  69. 测试类  
  70. package com.bjpowernode.usermgr.manager;  
  71.   
  72. import junit.framework.TestCase;  
  73.   
  74. import com.bjpowernode.usermgr.domain.User;  
  75.   
  76. public class UserManagerImplTest extends TestCase {  
  77.   
  78.     public void testAddUser() {  
  79.         UserManager userManager=new UserManagerImpl();  
  80.         User user=new User();  
  1.     user.setName("张三");  
  2.     userManager.addUser(user);  
  3. }  

 

注意:

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或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

转载于:https://www.cnblogs.com/sharpest/p/7282989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值