Hibernate中Session与本地线程绑定

------------------siwuxie095

Hibernate 中 Session 与本地线程绑定

1、Session 类似于 JDBC 的连接 Connection

2、Session 对象是单线程对象,只能自己使用,不能共用

将 Session 与本地线程绑定,保证 Session 对象绝对是一个单线程对象

3、Hibernate 帮助我们实现了 Session 与本地线程绑定(底层是 ThreadLocal)

4、获取与本地线程绑定的 Session

(1)在 Hibernate 核心配置文件中进行配置


<!-- 配置 Session 绑定本地线程 -->

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

(2)调用
SessionFactory 的 getCurrentSession() 方法获取 Session

HibernateUtils.java:


package com.siwuxie095.utils;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class HibernateUtils {

static Configuration cfg=null;

static SessionFactory sessionFactory=null;

//或:
加上 private final 亦可,不过此时不能等于 null

// private static final Configuration cfg;

// private static final SessionFactory sessionFactory;

//静态代码块

static {

//加载核心配置文件

cfg=new Configuration();

cfg.configure();

sessionFactory=cfg.buildSessionFactory();

}

//提供方法返回 sessionFactory

public static SessionFactory getSessionFactory() {

return sessionFactory;

}

//提供方法返回与本地线程绑定的 Session

public static Session getCurrentSession() {

return sessionFactory.getCurrentSession();

}

}

测试函数
testSession():


@Test

public
void testSession(){

Session session=null;

Transaction tx=null;

try {

session=HibernateUtils.getCurrentSession();

//开启事务

tx=session.beginTransaction();

//添加操作

User user=new User();

user.setUsername("小明");

user.setPassword("8888");

user.setAddress("中国");

session.save(user);

//提交事务

tx.commit();

} catch (Exception e) {

//回滚事务

tx.rollback();

} finally {

//最后不用关闭 Session,随着线程

//执行结束,Session 将自动关闭

//

//下面一行代码不用写,否则将报错

//session.close();

}

}

4、与本地线程绑定的
Session 最后不用手动关闭,当线程执行结束后,

Session 将会自动关闭。如果手动关闭,将报错

「二者是一根绳上的蚂蚱,线程一旦结束,Session 就会自动关闭」

注:

另:

User.hbm.xml:


<?xml
version="1.0"
encoding="UTF-8"
?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<!--

http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd

该 dtd 文件是用于提示的文件,联网即有提示信息,也可

手动添加:Window->Preferences->XML->XML Catalog,

点击 Add 添加即可,Location 即路径,Key 即上面的链接,

Key type 即 URI

-->

<!-- 根标签 -->

<hibernate-mapping>

<!-- (1)

class 标签:配置实体类和数据库表的对应;

name 属性:实体类的全路径,即
全限定名;

table 属性:数据库表的名称(数据库表由 Hibernate 自动生成) -->

<class
name="com.siwuxie095.entity.User"
table="t_user">

<!-- (2)

id 标签:配置实体类 id 和表 id 对应(主键);

name 属性:实体类里 id 属性名称;

column 属性:生成表中 id 字段名称 -->

<!-- Hibernate 要求实体类有一个属性唯一值,

Hibernate 要求表中字段有一个属性唯一值 -->

<id
name="uid"
column="uid">

<!-- 设置数据库表 id 的增长策略,

native:主键 id 值自动增长 -->

<generator
class="native"></generator>

</id>

<!-- (3)

property 标签:配置其它属性和表中字段对应;

name 属性:实体类属性名称;

column 属性:生成表中字段名称 -->

<property
name="username"
column="username"></property>

<property
name="password"
column="password"></property>

<property
name="address"
column="address"></property>

</class>

</hibernate-mapping>

Hibernate.cfg.xml:


<?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="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

<!-- 或使用 jdbc:mysql:///hibernate_db 代替,省略 localhost -->

<property
name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_db</property>

<property
name="hibernate.connection.username">root</property>

<property
name="hibernate.connection.password">8888</property>

<!-- 第二部分:配置 Hibernate 信息(可选) -->

<!-- 输出底层 sql 语句 -->

<property
name="hibernate.show_sql">true</property>

<!-- 输出底层 sql 语句格式 -->

<property
name="hibernate.format_sql">true</property>

<!-- Hibernate 帮助创建表,不是自动创建,而需要配置之后。

update:如果已经有表,就更新,如果没有,就自动创建 -->

<property
name="hibernate.hbm2ddl.auto">update</property>

<!-- 配置数据库方言,让 Hibernate 框架识别不同数据库自己特有的语句。

如:在 MySQL 中实现分页的关键字 limit,只能在 MySQL 中使用,而

在 Oracle 中实现分页的关键字则是 rownum -->

<property
name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!--

事务隔离级别:

hibernate.connection.isolation = 4

1 - Read uncommitted isolation(未提交读:脏读、不可重复读、幻读均可能发生)

2 - Read committed isolation(已提交读:防止脏读发生,不可重复读、幻读均可能发生)

4 - Repeatable read isolation(可重复读:防止脏读、不可重复读发生,幻读可能发生)

8 - Serializable isolation(可串行化:防止脏读、不可重复读、幻读发生)

-->

<property
name="hibernate.connection.isolation">4</property>

<!-- 配置 Session 绑定本地线程 -->

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

<!-- 第三部分:引入映射配置文件,把映射配置文件放到核心配置文件(必须) -->

<mapping
resource="com/siwuxie095/entity/User.hbm.xml"/>

</session-factory>

</hibernate-configuration>

【made by siwuxie095】

时间: 2024-08-05 11:17:15

Hibernate中Session与本地线程绑定的相关文章

[原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

hibernate中session线程安全的实现

在hibernate中session是使用ThreadLocal实现线程安全的. ThreadLocal并不是一个Thread,而是一个线程副本,ThreadLocal为每个使用该变量的线程提供一个变量副本,线程修改自己的变量副本不会影响其他线程的变量副本 ThreadLocal有四个方法: set():设置当前线程的局部变量的值 get():获取当前线程的局部变量的值 remove():将当前线程局部变量的值删除,此方法不必显示的调用,因为局部变量自有垃圾回收器去清理 initialValue

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get

Hibernate中Session的get和load

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable id, L

hibernate中session

hibernate中的session是一级缓存,可以理解为进程级的缓存.在进程运行期间一直存在. session可以理解为一个可以操作数据库的对象 具体如何操作数据库? session中有方法, 如果只是单独的hibernate程序的话. 获得session之后,打开事务,操作数据库,提交(回滚事务),关闭session.就这样完成了操作DB ? Hibernate中session的使用: 在Hibernate中session主要是用来操作数据库? Hibernate在操作数据库前需要得到Ses

[转]Hibernate中Session的get和load

hibernate中Session接口提供的get()和load()方法都是用来获取一个实体对象,在使用方式和查询性能上有一些区别.测试版本:hibernate 4.2.0. get Session接口提供了4个重载的get方法,分别通过“持久类+主键”和“全类名+主键”以及“锁选项”来获取实体对象. public Object get(Class clazz, Serializable id); public Object get(Class clazz, Serializable id, L

HttpSession与Hibernate中Session的区别

HttpSession与Hibernate中Session的区别 一.javax.servlet.http.HttpSession是一个抽象接口 它的产生:J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户身份的唯一表示.注意,是容器(Tomcat,Resin)自动创建的. 用途:存放这个用户的一些经常被用到的信息,例如:用户名,权限.例如在购物车程序里,存放用户买的商品. 销毁:一定时间(跟容器有关)内,用户无任何动作,session

Hibernate入门(四)之hibernate中session的创建方式

为什么要专注于session的创建方式 在有些场景必须关注session的创建,比如说在银行转账操作的时候,两个账户转账必须在同一个session中 如上面所示,账户1钱没了,账户2钱却没有到,原因就在于两者不再同一个事务当中,不能实现事务的回滚. getCurrentSession 说明: 1.产生方式的说明 1.先检查当前线程中是否有session 2.如果当前线程中有session,则把session提取出来,直接使用 3.如果当前线程中没有session,则采用openSession方法

Hibernate中Session的关闭处理(无法获取连接池)

java.lang.IllegalStateException: Pool not open 在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的.在利用Spring + Hibernate进行开发时也是如此.下面是一个简单的Spring + Hibernate Dao的例子: 程序代码public class DaoReal extends HibernateDaoSupport implements Dao { public Li