获得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
}
}

最新文章

  1. 2016 ICPC青岛站---k题 Finding Hotels(K-D树)
  2. js 相关知识整理(一)
  3. codeforces #270 ABCD
  4. 如何查看mysql索引
  5. bzoj1058: [ZJOI2007]报表统计
  6. iOS开发——面试笔试精华(一)
  7. Redis安全
  8. PHP多线程的实现(PHP多线程类)
  9. Spring MVC 的文件下载
  10. mysql 字符编码
  11. JaVa第二周学习总结
  12. IoT experitment
  13. OID的编解码(即在报文中的体现)
  14. 移动端reset
  15. 2.网络编程-udp
  16. mininet下建立拓扑时关于远程控制器的一个小问题
  17. 【Logstash系列】使用Logstash作为收集端采集IIS日志
  18. Atcoder Tenka1 Programmer Contest 2019 题解
  19. Spring依赖注入servlet会话监听器
  20. Linux查看磁盘读写

热门文章

  1. Vue.js:使用vue-cli快速构建项目
  2. Codeforces 939D - Love Rescue
  3. ansible special topics
  4. F2BPM中关于工作流引擎驳回设计
  5. [Windows]_[0基础]_[Release程序的崩溃报告minidump解决方式]
  6. hdu1316(大数的斐波那契数)
  7. Cocos2d-x 开发神器cococreator使用介绍
  8. extjs_07_combobox&amp;amp;tree&amp;amp;chart
  9. Pointcut is not well-formed: expecting &amp;#39;name pattern&amp;#39; at character position 36
  10. 用 JSQMessagesViewController 创建一个 iOS 聊天 App - 第 2 部分