• 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. linux删除目录下指定后缀的文件

    这几天在Colab上使用ImageAI训练模型时每次都会保存精确度有所提升的模型,这些模型可以算是中间产物,不太重要.为了避免混淆,运行完通过以下命令删除. find . -name "*. ...

  2. win10 sedlauncher.exe占用cpu处理

    打开应用和功能,搜KB4023057,然后卸载. 打开系统服务,找到Windows Remediation Service (sedsvc)和Windows Update Medic Service ...

  3. java模拟post进行文件提交 采用httpClient方法

    package com.jd.vd.manage.util.filemultipart; import java.io.BufferedReader;import java.io.File;impor ...

  4. shell统计ip访问情况并分析访问日志

    有日志 1.log,部分内容如下: 112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com“/seccode.php?upd ...

  5. 002-创建型-04-建造者模式(Builder)、JDK1.7源码中的建造者模式、Spring中的建造者模式

    一.概述 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象 ...

  6. Qt编写控件属性设计器9-数据库采集

    一.前言 数据库作为数据源,在很多组态软件中使用非常多,指定数据库类型,填写好数据库连接信息,指定对应的数据库表和字段,采集间隔,程序按照采集间隔自动采集数据库数据,绑定到界面上的控件赋值显示即可.使 ...

  7. delphi TClientDatset资料

    第十一章 TClientDataSet 与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.TClientDataSet最大 ...

  8. activity 工作流

    https://blog.csdn.net/cs_hnu_scw/article/details/79059965 https://blog.csdn.net/xnf1991/article/deta ...

  9. CRISP-DM

    CRISP-DM (cross-industry standard process for data mining), 即为"跨行业数据挖掘标准流程". 此KDD过程模型于1999 ...

  10. Docker镜像的构建(五)

    目录 构建镜像 1.使用 commit 命令构建 1.1 运行一个要进行修改的容器 1.2 安装 Apache 软件包 1.3 提交定制容器 2.使用 Dockerfile 构建 2.1 我们的第一个 ...