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

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

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

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

HibernateUtil管理Session的工具类

  1. package com.bjpowernode.usermgr.util;
  2. import org.hibernate.Session;//hibernate3的
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.cfg.Configuration;
  5. public class HibernateUtils {
  6. private static SessionFactory factory;
  7. static{
  8. try{
  9. //读取hibernate.cfg.xml文件
  10. Configuration cfg=new Configuration().configure();
  11. //建立SessionFactory
  12. factory=cfg.buildSessionFactory();
  13. }catch(Exception e){
  14. e.printStackTrace();
  15. }
  16. }
  17. //获得开启着的Session
  18. public static Session getSession(){
  19. return factory.openSession();
  20. }
  21. //关闭Session
  22. public static void closeSession(Session session){
  23. if(session!=null){
  24. if(session.isOpen()){
  25. session.close();
  26. }
  27. }
  28. }
  29. public static SessionFactory getSessionFactory(){
  30. return factory;
  31. }
  32. }
  1. 用户业务逻辑层
  2. package com.bjpowernode.usermgr.manager;
  3. import java.util.Date;
  4. import org.hibernate.Session;
  5. import com.bjpowernode.usermgr.domain.Log;
  6. import com.bjpowernode.usermgr.domain.User;
  7. import com.bjpowernode.usermgr.util.HibernateUtils;
  8. public class UserManagerImpl implements UserManager {
  9. /**
  10. * 添加用户和添加日志都使用了同一个Session,所以
  11. * 当用户添加失败的时候,日志也会添加失败。事务回滚
  12. * 用户添加成功日志也会添加成功
  13. */
  14. public void addUser(User user) {
  15. Session session=null;
  16. try{
  17. //取得当前线程Session
  18. session=HibernateUtils.getSessionFactory().getCurrentSession();
  19. session.beginTransaction();
  20. //保存用户
  21. session.save(user);
  22. Log log=new Log();
  23. log.setType("操作日志");
  24. log.setTime(new Date());
  25. log.setDetail("XXX");
  26. LogManager logManager=new LogManagerImpl();
  27. //保存日志
  28. logManager.addLog(log);
  29. session.getTransaction().commit();
  30. }catch(Exception e){
  31. e.printStackTrace();
  32. session.getTransaction().rollback();
  33. }
  34. }
  35. }
  36. 日志实现类:
  37. package com.bjpowernode.usermgr.manager;
  38. import org.hibernate.Session;
  39. import com.bjpowernode.usermgr.domain.Log;
  40. import com.bjpowernode.usermgr.util.HibernateUtils;
  41. public class LogManagerImpl implements LogManager {
  42. public void addLog(Log log) {
  43. //获取当前线程的Session
  44. HibernateUtils.getSessionFactory().getCurrentSession().save(log);
  45. }
  46. }
  47. 测试类
  48. package com.bjpowernode.usermgr.manager;
  49. import junit.framework.TestCase;
  50. import com.bjpowernode.usermgr.domain.User;
  51. public class UserManagerImplTest extends TestCase {
  52. public void testAddUser() {
  53. UserManager userManager=new UserManagerImpl();
  54. 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或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

Hibernate中两种获取Session的方式的更多相关文章

  1. Hibernate中两种删除用户的方式

    第一种,是比较传统的,先根据主键列进行查询到用户,在进行删除用户 //删除数据 public void deleteStudent(String sno) { init() ; Student qu ...

  2. 两种获取connectionString的方式

    两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...

  3. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  4. JavaScript中几种 获取元素的方式

    1.根据id获取元素 document.getElementById("id属性的值"); 2.根据标签名字获取元素 document.getElementsByTagName(& ...

  5. AppCan中两种获取信息的方法

    <div id="newsInfo">正在加载...</div> 1.JSON格式: [{'R': '1','NOTI_ID': '9','NOTI_TIT ...

  6. java中几种获取项目路径方式

    转自http://caodaoxi.iteye.com/blog/1234805     在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录 ...

  7. java(JSP)中几种获取项目路径方式

    在jsp和class文件中调用的相对路径不同. 在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getPro ...

  8. spring&pom两种获取profile的方式

    一.原理: 1.实现ApplicationContextAware(当一个类实现了ApplicationContextAware这个接口之后,这个类就可以通过setApplicationContext ...

  9. hadoop中两种上传文件方式

    记录如何将本地文件上传至HDFS中 前提是已经启动了hadoop成功(nodedate都成功启动) ①先切换到HDFS用户 ②创建一个user件夹 bin/hdfs dfs -mkdir /user ...

随机推荐

  1. java消息队列怎么用

    消息队列的使用场景是怎样的? 经常听到诸如rebbitmq,activemq,请教一下各位前辈消息队列的使用场景是怎样的,什么时候会用到它   校验用户名等信息,如果没问题会在数据库中添加一个用户记录 ...

  2. C语言printf()函数具体解释和安全隐患

    一.问题描写叙述 二.进一步说明 请细致注意看,有例如以下奇怪的现象 int a=5; floatx=a; //这里转换是没有问题的.%f打印x是 5.000000 printf("%d\n ...

  3. C++对象模型——Default Constructor的建构操作(第二章)

    第2章    构造函数语意学 (The Semantics of Constructor) 关于C++,最常听到的一个抱怨就是,编译器背着程序猿做了太多事情.Conversion运算符就是最常被引用的 ...

  4. 【转载】究竟啥才是互联网架构“高并发”

    一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间( ...

  5. Python——list切片

    前文简单介绍了Python中的list和它常用的一些函数,知道list是一个有序的数据集合,那么我们如何获取list中的元素呢? Index: 与C语言中数组一样,list可以通过每个元素的index ...

  6. windows下安装RubbitMq

    1.下载 下载 rabbitMQ :http://www.rabbitmq.com/download.html,安装rabbitmq需要erlang,下载erlang:http://www.erlan ...

  7. 基于MATLAB的滤波算法

    目前比较经典的图像去噪算法主要有以下三种: 均值滤波:也称线性滤波,主要思想为邻域平均法,即用几个像素灰度  的平均值来代替每个像素的灰度.有效抑制加性噪声,但容易引起图像模糊,  可以对其进行改进, ...

  8. i2c_set_clientdata函数【转】

    本文转载自‘:http://blog.csdn.net/jk198310/article/details/43738367 在i2c驱动中有很多函数和数据结构,很多一时难以理解,所以写下本文共同学习. ...

  9. POJ2516 Minimum Cost —— 最小费用最大流

    题目链接:https://vjudge.net/problem/POJ-2516 Minimum Cost Time Limit: 4000MS   Memory Limit: 65536K Tota ...

  10. YTU 2419: C语言习题 等长字符串排序

    2419: C语言习题 等长字符串排序 时间限制: 1 Sec  内存限制: 128 MB 提交: 650  解决: 249 题目描述 在主函数中输入n(n<=10)个等长的字符串.用另一函数对 ...