• 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. golang gin解决跨域访问

    package middleware import ( "github.com/gin-gonic/gin" "net/http") func Cors() g ...

  2. Mysql --- Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

    我使用的5.5的mysql数据库会报这个错, 换成5.7的就可以了

  3. pytest 基本用法

    1.断言用assert,可以进行==,!=,+,-,*,/,<=,>=,is True.False,is not True.False ,in ,not in 等判断. import py ...

  4. CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天

    CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天

  5. delphi 获得父目录–指定级父目录

    function get_dir_parent(dir:string;n:integer):string; //n为几级父目录varst:string;i:integer;begin st:=GetC ...

  6. Pytho之Django

    Django工程目录讲解: manage.py脚本:用于管理Django站点 settings.py: 包含项目的所有配置参数 urls.py: URL根配置 wsgi.py: 内置runserver ...

  7. IfcSlab

    // IfcRoot ----------------------------------------------------------- // attributes: // shared_ptr& ...

  8. java生成RSA公私钥字符串,简单易懂

    java生成RSA公私钥字符串,简单易懂   解决方法: 1.下载bcprov-jdk16-140.jar包,参考:http://www.yayihouse.com/yayishuwu/chapter ...

  9. spark osx:WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform

    spark-env.sh文件中增加,确保${HADOOP_HOME}/lib/native目录下有libhadoop.so文件 export JAVA_LIBRARY_PATH=${HADOOP_HO ...

  10. CentOS7.2配置LNMP环境并安装配置网站WordPress

    1,安装环境查看 2,安装MySQL5.7.22 下载MySQL wget https://downloads.mysql.com/archives/get/file/mysql-5.7.22-1.e ...