• 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. Fences_3.08破解安装

    Fences_3.08破解安装 一.总结 一句话总结: 找破解软件去吾爱破解论坛,非常节约时间 二.Fences_3.08破解安装(亲测有效) 来源:吾爱破解论坛 百度网盘下载地址:链接:https: ...

  2. IIS配置问题:WCF服务打开svc文件报错:请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理

    在参考网上多个教程后,我用IIS配置的网站终于能正常打开了,但是很快就发现了新的问题,在打开WCF服务中的svc文件时报错: HTTP 错误 404.17 - Not Found请求的内容似乎是脚本, ...

  3. struts2之Action与JSP相互数据传递

    package com.loaderman.crm.action; import com.loaderman.crm.entity.User; import com.loaderman.crm.ser ...

  4. IOS APP开发入门案例

    1.创建新项目 2.设计布局,main.storyboard中,在控件库中 3.布局控件关联控制器 4.设置事件或者显示模式 5.编写代码: import UIKit class ViewContro ...

  5. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景   Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...

  6. 一百四十五:CMS系统之帖子加精和取消加精

    模型 class HighlightPostModel(db.Model): """ 帖子加精信息 """ __tablename__ = ...

  7. CDS视图篇 2

    核心数据服务 (CDS) 公司希望使用 SAPS/4HANA 核心数据服务 (CDS) 视图技术.需要学习 CDS 视 图的概念和结构以及语法 . ● 核心数据服务是用于业务实体的 SAP 战略建模方 ...

  8. vmware安装密钥

    VMware虚拟机已升级至14版本,之前的12版本的秘钥已经无法使用,在此分享一下VMware Workstation 14永久激活密钥: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ...

  9. 【Leetcode_easy】783. Minimum Distance Between BST Nodes

    problem 783. Minimum Distance Between BST Nodes 参考 1. Leetcode_easy_783. Minimum Distance Between BS ...

  10. 【c# 学习笔记】多态

    由于可以继承基类的所有成员,子类就都有了相同的行为,但是有时子类的某些行为需要相互区别,子类需要覆写父类中的方法来实现子类特有的行为,这样 的技术在面向对象的编程中就是多态. 多态即相同类型的对象调用 ...