• HibernateUtil.getSessionFactory().getCurrentSession() 和HibernateUtil.getSession() 的区别:

    1.异:getCurrentSession() 创建的线程会在事务回滚或事物提交后自动关闭,而getSession需要手动关闭。

    2.同:都是从本地线程中取得session

  • 每次使用sessionFactory.openSession()获得的session都不一样。

案例一:

  • UserDao.java
package dao;

import org.hibernate.Session;
import org.hibernate.Transaction; import bean.User;
import util.HibernateUtil; public class UserDao { public static void save1() { Session session = null;
Transaction tran = null; User user = new User();
user.setUserid(9);
user.setUsername("user7");
user.setPassword("123"); try {
session = HibernateUtil.getSessionFactory().openSession();
tran = session.beginTransaction(); session.save(user); tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if(session!=null){
session.close();
}
} } public static void save2() { Session session = null;
Transaction tran = null; User user = new User();
user.setUserid(9);
user.setUsername("user7");
user.setPassword("123"); try {
session = HibernateUtil.getSession();
System.out.println("userdao session=="+session.hashCode());
tran = session.beginTransaction(); session.save(user); tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
// HibernateUtil.closeSession();
} } public static void save3() { Session session = null;
Transaction tran = null; User user = new User();
user.setUserid(9);
user.setUsername("user7");
user.setPassword("123"); try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
System.out.println("userdao session=="+session.hashCode());
tran = session.beginTransaction(); session.save(user); tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
} } public static void save4(Session session) { Transaction tran = null; User user = new User();
user.setUserid(9);
user.setUsername("user7");
user.setPassword("123"); try { System.out.println("userdao session=="+session.hashCode());
tran = session.beginTransaction(); session.save(user); tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
}
}
}
  • RoleDao.java
package dao;

import org.hibernate.Session;
import org.hibernate.Transaction; import util.HibernateUtil;
import bean.User; public class RoleDao {
public static void save1() { Session session = null;
Transaction tran = null; User user = new User();
user.setUserid(10);
user.setUsername("user7");
user.setPassword("123"); try {
session = HibernateUtil.getSessionFactory().openSession();
tran = session.beginTransaction(); session.save(user); int i=1/0; tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
if(session!=null){
session.close();
}
} } public static void save2() { Session session = null;
Transaction tran = null; User user = new User();
user.setUserid(10);
user.setUsername("user7");
user.setPassword("123"); try {
session = HibernateUtil.getSession();
System.out.println("rolesession=="+session.hashCode());
tran = session.beginTransaction(); session.save(user); int i=1/0; tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
HibernateUtil.closeSession();
} } public static void save3() { Session session = null;
Transaction tran = null; User user = new User();
user.setUserid(10);
user.setUsername("user7");
user.setPassword("123"); try {
session = HibernateUtil.getSessionFactory().getCurrentSession();
System.out.println("roledao session=="+session.hashCode());
tran = session.beginTransaction(); session.save(user);
int i=2/0;
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
} } public static void save4(Session session) { Transaction tran = null; User user = new User();
user.setUserid(10);
user.setUsername("user7");
user.setPassword("123"); try { System.out.println("roledao session=="+session.hashCode());
tran = session.beginTransaction(); session.save(user);
int i=2/0;
tran.commit();
} catch (Exception e) {
e.printStackTrace();
tran.rollback();
} finally {
}
} }
  • Hibernate_Session.java
package action;

import org.hibernate.Session;
import org.hibernate.SessionFactory; import bean.Role;
import dao.RoleDao;
import dao.UserDao;
import util.HibernateUtil; /**
* Hibernate中的Session的事务管理
*
* @author 半颗柠檬、
*
*/
public class Hibernate_Session {
public static void main(String[] args) {
// Hibernate_Session.testone(); // Hibernate_Session.testTwo(); // Hibernate_Session.testThree(); Hibernate_Session.testFour();
} private static void testone() { /**
* 每次由sessionFactory。openSession()得到的session都不一样,
*/
SessionFactory sessionFactory = HibernateUtil.getSessionFactory(); Session session1 = sessionFactory.openSession();
System.out.println(session1.hashCode()); Session session2 = sessionFactory.openSession();
System.out.println(session2.hashCode()); /*
* UserDao和RoleDao中的save1方法的session都是通过sessionFactory.openSession()所得到,
* 不是同一个session,也就是说两个方法不是公用一个事务
*/
UserDao.save1();
RoleDao.save1(); } private static void testTwo() { /**
* 由HibernateUtil.getSession()得到的是同一个session对象,查看HibernateUtil。
* getSession()可知getSession方法是从ThreadLocal中取得的。
*/
Session session1 = HibernateUtil.getSession();
System.out.println(session1.hashCode()); Session session2 = HibernateUtil.getSession();
System.out.println(session2.hashCode()); /**
* 虽然UserDao和RoleDao中是同一个session,但是两个方法却不是同一个事务,因为每一个方法里的tran.commit()
* 方法都隐式调用了flush方法,这个方法
* 的主要作用是清理缓存,强制数据库与Hibernate缓存同步,以保证数据的一致性,然后再提交事务,UserDao.save2()方法
* 已经提交事务,等到RoleDao.save2()方法的时候, 事务已经是新的了。
*/
UserDao.save2();
RoleDao.save2(); } /**
* 使用getCurrentSession时, 在hibernate.cfg.xml中要配置
*
* <property name="current_session_context_class">thread</property>
* 这个配置的目的是把session交给ThreadLocal管理
*
* getCurrentSession时,Session会自动关闭。不需要手工关闭。
*/
private static void testThree() { /**
* 使用getSessionFactory().getCurrentSession()得到的session是同一个线程上的同一个session
* getSessionFactory().
* getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,如果手动关闭则会报错。
*/
Session session1 = HibernateUtil.getSessionFactory()
.getCurrentSession();
System.out.println(session1.hashCode()); Session session2 = HibernateUtil.getSessionFactory()
.getCurrentSession();
System.out.println(session2.hashCode()); /**
* 两个方法依然无法共享一个事务,值得注意的是这两个方法的session不是同一个session,
* 原因在于getCurrentSession的session会在事务回滚或者提交之后自动关闭
* ,当UserDao.save3()成功提交之后session就关闭了,所以RoelDao的session是重新创建的 session
*/
UserDao.save3();
RoleDao.save3(); } private static void testFour() { Session session = HibernateUtil.getSessionFactory().getCurrentSession(); /**
* UserDao和RoleDao的save4方法共享一个session
* 但是依旧无法共享事务,因为session在UserDao.save4方法提交的时候已经被关闭了,
* RoleDao.save4使用session就会报错,错误消息为“Session is closed!”
*/
UserDao.save4(session);
RoleDao.save4(session); } }
  • 总结:   在hibernate中很难控制事务,如果需要控制事务,一般都是和spring的声明式事务一起使用。

代码在下章

(八) Hibernate中的Session以及事务的更多相关文章

  1. hibernate 中的session和事务(Transaction)

    在使用hibernate开发时,遇到最多的就是session与事务,那么他们两个有什么关系呢?下面我来抛砖引玉: 1.session是hibernate中的以及缓存机制,是用来对数据进行增删改查的一个 ...

  2. 第四讲 :hibernate中的session

    hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要:  Transaction beginTransaction()开始一个工作单元,得到关联的事务对象 ...

  3. 关于hibernate中的session与数据库连接关系以及getCurrentSession 与 openSession() 的区别

    1.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用.   2.多个sessi ...

  4. Hibernate中的Session

    我们之前也经常使用Session,通过连接服务器将需要保存的值存到服务器的session中,这是之前关于session的简单应用.现在看到Hibernate框架中也有关于Session的定义,该定义是 ...

  5. Hibernate中的Session对象 标签: hibernatesession 2017-01-22 22:10 238人阅读 评论(

    Hibernate中的Session 大家在看hibernate视频的时候一定都发现了,每次要操作数据库,总是要新建一个session对象,Hibernate在对资料库进行操作之前,必须先取得Sess ...

  6. Hibernate中的Session缓存问题

    1. Session 缓存: 1) . 在 Session 接口的实现中包括一系列的 Java 集合 , 这些 Java 集合构成了 Session 缓存 .          它用于存放 Sessi ...

  7. Hibernate中的session和load延迟载入矛盾问题,怎样解决?

    假设延迟载入出现session close的情况下 方法1.在web.xml中配置spring的openSessionInViewFilter <filter>  <filter-n ...

  8. Hibernate中的session对象update方法的使用

    使一个游离对象转变为持久化对象.例如以下代码在session1中保存了一个Customer对象,然后在session2中更新这个Customer对象: Customer customer = new ...

  9. hibernate中获得session的方式

    his.getsession实际上是调用了父类中的方法获得session.使用spring管理hibernate的SessionFactory的时候,这个方法会从session池中拿出一session ...

随机推荐

  1. FM与FFM深入解析

    因子机的定义 机器学习中的建模问题可以归纳为从数据中学习一个函数,它将实值的特征向量映射到一个特定的集合中.例如,对于回归问题,集合 T 就是实数集 R,对于二分类问题,这个集合可以是{+1,-1}. ...

  2. bs4 string与text的区别

    用python写爬虫时,BeautifulSoup真是解析html,快速获取所需数据的神器. 这个美味汤使唤起来,屡试不爽. 在用find()方法找到特定的tag后,想获取里面的文本,可以用.text ...

  3. vsCode中如何根据屏幕宽度自动换行

      在设置中搜索editor.wordWrap   文章来源:外星人来地球 欢迎关注,有问题一起学习欢迎留言.评论

  4. Spring Bootz之热部署

    在项目的pom.xml文件添加如下两段 <dependency> <groupId>org.springframework.boot</groupId> <a ...

  5. SurfaceView概述和基本使用

    Android屏幕刷新一遍时间间隔为16ms,如果view能够在16ms内完成所需要执行的绘图换作,那么在视觉上,界面就是流畅的,否则就会出现卡顿现象,在很多情况下,这些逻辑处理又是必须的,为了解决这 ...

  6. osg fbx 模型结构操作

    osg::Node* TeslaManage::findOsgNodeByName(QString &nodeNme) { osg::Node* findNode = NULL; std::v ...

  7. Elasticsearch(ELK)集群搭建

    一.前言 Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储.检索数据:本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据.Elasticsearch也使用 ...

  8. SpringMVC+Ajax实现文件批量上传和下载功能实例代码

    需求: 文件批量上传,支持断点续传. 文件批量下载,支持断点续传. 使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中. 服务器不需要打包. 支持大文件断点下载.比如下 ...

  9. PAT 甲级 1034 Head of a Gang (30 分)(bfs,map,强连通)

    1034 Head of a Gang (30 分)   One way that the police finds the head of a gang is to check people's p ...

  10. UIImagePickerController的用法

    在实际的APP开发中,我们经常会见到应用的这样的功能 :需要选取手机相册的照片,还有选取视频,拍视频和照相的操作. 在iOS开发中,实现以上的功能就需要用到 UIImagePickerControll ...