获得session对象有两种方法:

1)openSession

2)getCurrentSession

  如果使用的是getCurrentSession需要在hibernate.cfg.xml文件中进行配置:

  如果是本地事务(jdbc事务),按照如下方法配置:

    <property name="hibernate.current_session_context_class">thread</property>

  如果是全局事务(jta事务)

    <property name="hibernate.current_session_context_class">jta</property>

例子:

先创建java类:

 package com.imooc.hibernate;

 import java.util.Date;

 public class Students {

     private int sid;
private String sname;
private String gender;
private Date birthday;
private String address; public Students(int sid, String sname, String gender, Date birthday, String address) {
super();
this.sid = sid;
this.sname = sname;
this.gender = gender;
this.birthday = birthday;
this.address = address;
} @Override
public String toString() {
return "Students [sid=" + sid + ", sname=" + sname + ", gender=" + gender + ", birthday=" + birthday
+ ", address=" + address + "]";
} public int getSid() {
return sid;
} public void setSid(int sid) {
this.sid = sid;
} public String getSname() {
return sname;
} public void setSname(String sname) {
this.sname = sname;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
}
}

java类的配置文件

 <?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-5-23 0:24:09 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
<class name="com.imooc.hibernate.Students" table="STUDENTS">
<id name="sid" type="int">
<column name="SID" />
<generator class="assigned" />
</id>
<property name="sname" type="java.lang.String">
<column name="SNAME" />
</property>
<property name="gender" type="java.lang.String">
<column name="GENDER" />
</property>
<property name="birthday" type="java.util.Date">
<column name="BIRTHDAY" />
</property>
<property name="address" type="java.lang.String">
<column name="ADDRESS" />
</property>
</class>
</hibernate-mapping>

hibernate配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 是否将sql语句打印到控制台,编码阶段便于测试,建议设为true -->
<property name="show_sql">true</property>
<!-- 是否将sql语句进行排版,建议设为true -->
<property name="format_sql">true</property>
<!-- 生成表结构的策略。create是如果之前有表结构,先删除表结构再重建;
update:原有的基础上更新;
create-drop:先删除表结构再重建
validate:与原表进行验证,如果和原表表结构不同,则不进行创建。
一般使用create和update
-->
<property name="hbm2ddl.auto">create</property> <!-- 使用getCurrentSession方法必须在配置文件中配置 -->
<property name="hibernate.current_session_context_class">thread</property> <mapping resource="com/imooc/hibernate/Students.hbm.xml"/>
</session-factory>
</hibernate-configuration>

测试类

 package com.icoom.test;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; public class SessionTest { /*
* 使用openSession获得session对象
*/
@Test
public void testOpenSession() {
Configuration config = new Configuration().configure();//获得配置对象(读取hibernate.cfg.xml文件)
// 获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
// 获得session对象
Session session = sessionFactory.openSession();
if (session != null) {
System.out.println("session创建成功");
} else {
System.out.println("session创建失败");
}
} /*
* 使用getCurrentSession获得session对象(需要在hibernate配置文件中设置)
*/
@Test
public void testGetCurrentSession() {
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.getCurrentSession();
if (session != null) {
System.out.println("session创建成功!");
} else {
System.out.println("session创建失败!");
}
}
}

那么,openSession和getCurrentSession有什么区别?

1. getCurrentSession在事务提交或者回滚之后会自动关闭,openSession需要手动关闭。如果使用openSession而没有手动关闭,多次之后会导致连接池溢出。

 package com.icoom.test;

 import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; import com.imooc.hibernate.Students; public class SessionTest { @Test
public void saveStudentsByOpenSession() { // 获取配置对象
Configuration configure = new Configuration().configure();
// 获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configure.getProperties()).buildServiceRegistry();
/*
* 创建sessionFactory对象。sessionFactory是一种工厂模式,
* 目的是返回session,而不必new一个session。这样做比较安全。
*/
SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry);
// 创建第一个session对象
Session session1 = sessionFactory.openSession();
// 开启事务
Transaction transaction = session1.beginTransaction();
// 生成一个学生对象
Students s = new Students(1,"张三","男",new Date(),"北京");
session1.doWork(new Work() { @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection's hashCode:" + connection.hashCode());
} });
session1.save(s);
// session1.close(); // 不执行close()方法,继续新建session对象
transaction.commit(); // 创建第二个session对象
Session session2 = sessionFactory.openSession();
transaction = session2.beginTransaction();
s = new Students(2,"李四","女",new Date(),"上海");
session2.doWork(new Work() { @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection's hashCode:" + connection.hashCode());
} });
session2.save(s);
transaction.commit();
}
}

控制台打印出两个hashcode值不同,所以使用openSession()方法而不手动关闭,每次创建都会新建一个链接,有可能导致连接池溢出。

再看getCurrentSession():

 package com.icoom.test;

 import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.jdbc.Work;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; import com.imooc.hibernate.Students; public class SessionTest { @Test
public void saveStudentsByGetCurrentSession() { // 获取配置对象
Configuration configure = new Configuration().configure();
// 获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(configure.getProperties()).buildServiceRegistry();
/*
* 创建sessionFactory对象。sessionFactory是一种工厂模式,
* 目的是返回session,而不必new一个session。这样做比较安全。
*/
SessionFactory sessionFactory = configure.buildSessionFactory(serviceRegistry);
// 创建第一个session对象
Session session1 = sessionFactory.getCurrentSession();
// 开启事务
Transaction transaction = session1.beginTransaction();
// 生成一个学生对象
Students s = new Students(1,"张三","男",new Date(),"北京");
session1.doWork(new Work() { @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection's hashCode:" + connection.hashCode());
} });
session1.save(s);
// session1.close(); // 不执行close()方法,继续新建session对象
transaction.commit(); // 创建第二个session对象
Session session2 = sessionFactory.getCurrentSession();
transaction = session2.beginTransaction();
s = new Students(2,"李四","女",new Date(),"上海");
session2.doWork(new Work() { @Override
public void execute(Connection connection) throws SQLException {
// TODO Auto-generated method stub
System.out.println("connection's hashCode:" + connection.hashCode());
} });
session2.save(s);
// session2.close();
transaction.commit();
}
}

两个hashCode一致。

2. openSession每次创建新的session对象,getCurrentSession使用现有的session对象。

 package com.icoom.test;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test; public class SessionTest { /*
* openSession每次创建新的session对象
*/
@Test
public void testOpenSession() {
Configuration config = new Configuration().configure();//获得配置对象(读取hibernate.cfg.xml文件)
// 获得服务注册对象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
// 获得sessionFactory对象
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
// 获得session对象
Session session1 = sessionFactory.openSession();
Session session2 = sessionFactory.openSession();
System.out.println(session1 == session2); // false
} /*
* getCurrentSession使用现有的session对象
*/
@Test
public void testGetCurrentSession() {
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = config.buildSessionFactory(serviceRegistry);
Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();
System.out.println(session1 == session2); // true
}
}

hibernate_03_session详解的更多相关文章

  1. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  2. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  3. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  4. Java 字符串格式化详解

    Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...

  5. Android Notification 详解(一)——基本操作

    Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...

  6. Android Notification 详解——基本操作

    Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...

  7. Git初探--笔记整理和Git命令详解

    几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...

  8. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  9. Node.js npm 详解

    一.npm简介 安装npm请阅读我之前的文章Hello Node中npm安装那一部分,不过只介绍了linux平台,如果是其它平台,有前辈写了更加详细的介绍. npm的全称:Node Package M ...

随机推荐

  1. linux修改mysql表结构

    增加字段: alter table [tablename] add [字段名] [字段类型] first(首位); alter table [tablename] add [字段名] [字段类型] a ...

  2. JavaSE 学习笔记之StringBuffer(十五)

    --< java.lang >-- StringBuffer字符串缓冲区: 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符. 特点: 1:可以对字符串内容进行修改. 2:是一 ...

  3. Java 注解之总结

    注解是Spring和Mybatis框架所大量使用的技术,要想掌握框架相关技术,注解是必须要掌握的. 掌握注解的优势: 1.能够读懂别人写的代码,特别是框架相关的代码. 2.本来可能需要很多配置文件,需 ...

  4. 清北学堂模拟赛d4t6 c

    分析:这道题比较有难度. 观察题目,发现只有当一行翻了奇数次后才会产生黑色格子,设有x行被翻了奇数次,y列被翻了偶数次,那么x*m + y*n - 2*x*y = s,接下来就要解方程了.对于二元一次 ...

  5. N天学习一个linux命令之ip

    用途 show / manipulate routing, devices, policy routing and tunnels 用法 通用格式 ip [ OPTIONS ] OBJECT { CO ...

  6. Java:解决Servlet的UTF8编码问题

    要让Servlet支持UTF8,需要在doGet或者doPost中添加如下一条语句: request.setCharacterEncoding("UTF-8");

  7. JEval使用实例

    jeval是为为你的Java应用程序提供可增加的.高性能.数学.  布尔和函数表达式的解析和运算的高级资源包. 以下这个样例包括了JEval经常使用功能: package demo0; import ...

  8. PHP5+标准函数库观察者之实现

    PHP的观察者设计模式实现相对简单,可是PHP5+版本号中已经有标准库类库支持,我们仅仅需简单继承并实现就能够了. 观察者:实现标准接口类库SplSubject. 一个注冊方法:attach.一个取消 ...

  9. css3中 弹性盒模型布局之box-flex

    box-flex:也就是让子容器针对父容器的宽高属性依照一定的规则来划分 Eg: html代码: <div class="wrap"> <div class=&q ...

  10. Wscript对象具体解释

    15.6  Windows脚本宿主的内建对象 每一个编程环境都提供了自己的对象模型,开发者 能够使用这些对象模型实现各种解决方式,WSH也不例外.WSH包括了一组核心对象,分别包括了属性和方法,能够用 ...