源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Hibernate中获取Session的两种方式代码示例

  • 时间:2021-11-07 10:10 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要: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或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。 [b]总结[/b] 以上就是本文关于Hibernate中获取Session的两种方式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅: [url=http://www.1sucai.cn/article/130307.htm][b]hibernate通过session实现增删改查操作实例解析[/b][/url] [url=http://www.1sucai.cn/article/130306.htm][b]快速了解Hibernate中的Session[/b][/url] [url=http://www.1sucai.cn/article/127436.htm][b]Hibernate使用hbm.xml配置映射关系解析[/b][/url] 如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部