Hibernate持久化对象生命周期原理解析

作者:koal 时间:2022-08-14 19:44:27 

三态的基本概念

1, 临时状态(Transient):也叫自由态,只存在于内存中,而在数据库中没有相应数据。用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫临时对象;

2, 持久化状态(Persistent):与session关联并且在数据库中有相应数据。已经持久化,加入到了Session缓存中。如通过hibernate语句保存的对象。处于此状态的对象叫持久对象;

3, 游离状态(Detached):持久化对象脱离了Session的对象。如Session缓存被清空的对象。特点:已经持久化,但不在Session缓存中。处于此状态的对象叫游离对象;

 

临时状态
     (Transient)

持久化状态
     (Persistent)

游离状态
     (Detached)

是否处于Session缓存中××
数据库中是否有对应记录×

Hibernate持久化对象生命周期原理解析

游离对象和临时对象异同

两者都不会被Session关联,对象属性和数据库可能不一致;

游离对象有持久化对象关闭Session而转化而来,在内存中还有对象所以此时就变成游离状态了;

Hibernate和SQL的关系

在操作了hibernate的方法如save()等后,并没有直接生成sql语句,去操作数据库,而是把这些更新存入Session中,只有Session缓存要被更新时,底层的sql语句才能执行,数据存入数据库;

下面举例说明:

一、Session.save(user)运行机理。

1、把User对象加入缓存中,使它变成持久化对象;

2、选用映射文件指定的标识生成ID;

3、在Session清理缓存时候执行:在底层生成一个insert sql语句,把对象存入数据库;

注意:在你执行Session.save(user)后,在Session清理缓存前,如果你修改user对象属性值,那么最终存入数据库的值将是最后修改的值;此过程中ID不能被修改;

二、Session.delete(user)运行过程。

如果user是持久化对象,则执行删除操作,同样底层数据库的执行条件是:在Session清理缓存时候;

如果user是游离对象:

1、将user对象和Session关联,使之成为持久化对象;

2、然后按照user 是持久化对象的过程执行;

三态之间的转换方法

①如何成为自由态?

对象通过构造方法成为自由态;持久态和游离态则通过session的delete方法成为自由态

②如何成为持久态?

对象可以由session的load或get方法直接成为持久态;自由态对象可以通过save,saveOrUpdate或persist方法成为持久态;游离态对象则可以通过update,saveOrUpdate成为持久态

③如何成为游离态?

游离态只能由持久态转换而来,通过close或clear方法实现。

几种转换方法的对比

1、get 与load

都是从数据库中加载数据封装为java对象,使得java对象从自由态直接变为持久态;
但是有两点区别:①get返回对象可以为null,load返回值则始终不为null,找不到时会抛异常②get即时执行insert,而load则是在使用此对象时才执行insert

2、save,update与saveOrUpdate

save是将自由态转为持久态,而update是将游离态转为持久态,saveOrUpdate可以说是两者的综合,它执行时先判断对象的状态(主要是通过有无主键判断的),若是自由态,则save,若是游离态,则update

3、save与persist

两者都是将对象由自由态转为持久态,但返回值不同:save返回主键值,而persist不返回

4、saveOrUpdate与merge

两者都是将自由态或游离态对象与数据库关联,但merge不改变对象的原有状态

此外,对clear与flush方法也作介绍。clear是将session中的对象全部变为游离态,是对象由持久态变为游离态的一种方法(另外一种是关闭session);flush方法时为了使update操作能即时进行(正常情况下,只有在事务关闭时才进行update操作)。

来源:https://www.cnblogs.com/koal/p/4300016.html

标签:Hibernate,对象,生命,周期
0
投稿

猜你喜欢

  • JAVASE系统实现抽卡功能

    2023-11-19 19:49:41
  • Java实现HDFS文件上传下载

    2022-05-18 15:08:06
  • Java编程中的条件判断之if语句的用法详解

    2022-11-27 14:14:36
  • Java特性之注解和异常 Throwable

    2023-04-22 13:14:53
  • LINQ操作符SelectMany的用法

    2021-08-22 18:20:37
  • SpringBoot项目@Async方法问题解决方案

    2023-11-12 03:55:26
  • Java多线程编程之访问共享对象和数据的方法

    2022-10-01 07:05:02
  • Java调用接口如何获取json数据解析后保存到数据库

    2023-11-16 15:01:36
  • C# DateTime与时间戳转换实例

    2022-12-12 08:34:12
  • Android编程实现拦截短信并屏蔽系统Notification的方法

    2022-09-16 01:55:14
  • 解析Flink内核原理与实现核心抽象

    2023-11-25 10:30:04
  • mybatis-plus 拦截器敏感字段加解密的实现

    2023-12-20 05:58:17
  • C#遍历子目录的方法

    2022-06-30 11:11:27
  • MyEclipse2017创建Spring项目的方法

    2023-01-02 17:00:25
  • C#将HashTable中键列表或值列表复制到一维数组的方法

    2022-01-05 22:12:12
  • Java 实现将List平均分成若干个集合

    2023-10-16 21:36:59
  • 详解Spring Boot自动装配的方法步骤

    2023-11-18 15:02:18
  • Android中asset文件夹与raw文件夹的区别深入解析

    2022-11-22 01:40:34
  • Java使用Iterator迭代器遍历集合数据的方法小结

    2021-10-28 00:22:40
  • java 获取日期的几天前,几个月前和几年前的实例

    2023-05-20 15:29:53
  • asp之家 软件编程 m.aspxhome.com