首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Hibernate中两种获取Session的模式

2012-12-22 
Hibernate中两种获取Session的方式Session:是应用程序与数据库之间的一个会话,是Hibernate运作的中心,持久

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{//取得当前线程Sessionsession=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) {//获取当前线程的SessionHibernateUtils.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或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。





热点排行