Hibernate-session的状态和方法

本文深入探讨Hibernate框架中的Session概念,解析其获取方式、状态变化及常用方法。了解openSession与getCurrentSession的区别,掌握瞬时态、持久态和游离态的概念,熟悉load与get等关键API的使用场景与差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:用于获取与数据库的物理连接。 Session 对象是轻量级的,并且设计为在每次需要与数据库进行交互时被实例化。持久态对象被保存,并通过 Session 对象检索找回。

一,Hibernate有两种方式获得session,分别是: openSession和getCurrentSession 
它们的区别在于 
1. 获取的是否是同一个session对象 
openSession每次都会得到一个新的Session对象 
getCurrentSession在同一个线程中,每次都是获取相同的Session对象,但是在不同的线程中获取的是不同的Session对象 
2. 事务提交的必要性 
openSession只有在增加,删除,修改的时候需要事务,查询时不需要的 
getCurrentSession是所有操作都必须放在事务中进行,并且提交事务后,session就自动关闭,不能够再进行关闭 

二,session的三种状态:
瞬时态:在数据库中没有对应id的记录,同时在session缓存中也不存对应ID的对象(一般是刚new()出来的对象)
持久态:在数据库中有对应id的记录,同时在session缓存中也存在对应ID的对象(调用了save()或saveOrUpdate()等方法)
游离态:在数据库中有对应ID的记录,但在session缓存中不存在对应ID的对象(调用了close(),clear(),evict()等方法,游离状态一定有ID)

三,session常用方法:
1,load()与get():用来获取一个实体对象
介绍:
load是采用延迟加载方法,即当我们采用load()方法加载一个对象时,并不会发送SQL语句,得到的只是一个包含了实体对象ID值的代理对象,只有当我们使用具体属性时候,才会发送SQL语句。
当我们通过get方法的时候,不管后边怎样,就先通过SQL将该对象查询出来,也就是常说的立即加载。
使用load的加载方式要比get的加载方式性能好一点,因为load加载的时候,只是得到一个代理对象,当真正需要的时候才会去查询。这也代表了延迟加载与立即加载的同比。
差异:
get()方法来加载对象,当我们试图得到一个id不存在的对象时候,会报空指针异常,也就是NullPointException。
load()方法来加载对象,如果id不存在,若我们不使用该对象的任何属性,不会报错;但如果需要使用属性(也就是真正的去查询该对象),会报异常,但该异常并不是空指针,而是ObjectNotFoundException。
load的LazyInitializationException(懒加载异常),因为是延时加载,所以通过load方法得到了代理对象,但此时我们的session关闭了,但我们的对象还是存在的啊,所以当我们准备使用该对象属性的时候,就会报LazyInitializationException异常了

2,save():保存对象。
瞬时态(刚new()的对象,通过save()持久化,从而进入持久化状态),不应将持久化对象或游离对象传递给save()方法

3,persist():和save()类似
程序执行 save() 会立即将持久化对象对应的数据插入数据库;而 persist() 则保证当它在一个事物外部被调用时,并不立即转换成 insert 语句,save()的返回值是一个Serializable对象,而persist()方法返回值为void。

4,update():更新带有标识符且是给定的处于游离状态的实例的持久化实例。
将游离对象加入到Session缓存中,使其转变为持久化对象,计划执行一个update语句。

5,merge():可以完成save()和update()方法的功能,将新的状态合并到已有的持久化对象上或创建新的持久化对象,将游离态对象变为持久态。

6,saveOrUpdate():保存(对象)或更新(对象)给定的实例。
同时包含了save()方法与update()方法的功能,如果传入的参数是临时对象,就调用save()方法;如果传入的参数是游离对象,就调用update()方法。

7,delete():从数据存储中删除持久化实例。
既可以删除持久化对象,也可以删除游离对象,如果传入的参数是游离对象,则先使游离对象与Session关联,使它变为持久化对象。如果参数是持久化对象,则忽略该步,计划执行一个delete语句,把对象从Session缓存中删除,该对象进入删除状态。

8,lock():把一个没有更改过的游离状态的对象变成持久状态。

9,close():通过释放和清理 JDBC 连接以结束该会话。

10,clear():完全清除该会话。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值