• 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. OpenJudge计算概论-数字求和

    /*========================================================= 数字求和 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个 ...

  2. 分享一款颜色神器ColorSchemer Studio

    ColorSchemer Studio是一款专业配色软件,网页设计或平面设计师必备工具,和ColorPix V1.2 屏幕取色同属一个公司佳作,使用ColorSchemer Studio吸取屏幕任一色 ...

  3. 移动端rem自适应

    window.onload = window.onresize = function (event) { document.documentElement.style.fontSize = 100 * ...

  4. 网站url路径优化方法完全讲解 (url优化、基于tp5、API接口开发)

    url优化可是网站开发的必备高阶技能,先看本实例优化前后效果比较: (同为调用前台模块下的index控制器下的index方法) 优化前:www.tp5.com/tp5/public/index.php ...

  5. 阶段5 3.微服务项目【学成在线】_day18 用户授权_07-动态查询用户权限-权限数据模型

    3 动态查询用户权限 3.1 需求分析 截至目前在测试授权时使用的权限数据是静态数据,正常情况的流程是: 1.管理员给用户分配权限,权限数据写到数据库中. 2.认证服务在进行用户认证时从数据库读取用户 ...

  6. Linux 7 关闭、禁用防火墙服务

    1 查看防火墙状态 [root@lvxinghao ~]# systemctl status firewalld 2 查看开机是否启动防火墙服务 [root@lvxinghao ~]# systemc ...

  7. 一百四十三:CMS系统之评论布局和功能一

    模型 class CommentModel(db.Model): """ 评论 """ __tablename__ = 'comment' ...

  8. netstat -anp/ss -t里的Send-Q和Recv-Q含义

    Send-Q 对方没有收到的数据或者说没有Ack的,还在本地缓冲区 Recv-Q 数据已经在本地接收缓冲区,但是还没有recv() The count of bytes not copied by t ...

  9. CenOS 7 权限命令

    修改拥有者chown chown 拥有者名称 文件名 修改组chgrpchgrp 组名 文件名 修改权限 chmodchmod 权限 文件名

  10. Ant 构建 Jmeter脚本报错详解

    在搭建Ant构建Jmeter脚本的时候,小组成员遇到了各种问题. 再这里总结一下,遇到类似问题的可以做个参考 1.提示 does not exist 解决方案: 出现这种的问题原因有很多. 先排除权限 ...