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

 更新时间:2020年09月24日 15:18:55   作者:koal  
这篇文章主要介绍了Hibernate持久化对象生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

三态的基本概念

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

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

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

 

临时状态
(Transient)

持久化状态
(Persistent)

游离状态
(Detached)

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

游离对象和临时对象异同

两者都不会被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操作)。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java订单30分钟未支付自动取消该怎么实现

    Java订单30分钟未支付自动取消该怎么实现

    在开发中往往会遇到一些关于延时任务的需求,例如生成订单30分钟未支付,则自动取消,下面这篇文章主要给大家介绍了关于Java订单30分钟未支付自动取消该怎么实现的相关资料,需要的朋友可以参考下
    2023-03-03
  • Eclipse创建JavaWeb工程的完整步骤记录

    Eclipse创建JavaWeb工程的完整步骤记录

    很多新手不知道Eclipse怎么创建Java Web项目,一起来看看吧,这篇文章主要给大家介绍了关于Eclipse创建JavaWeb工程的完整步骤,需要的朋友可以参考下
    2023-10-10
  • Java 实战项目锤炼之朴素风格个人博客系统的实现流程

    Java 实战项目锤炼之朴素风格个人博客系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Java+vue+Springboot+ssm+mysql+maven+redis实现一个朴素风格的个人博客系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java中初始化块详解及实例代码

    Java中初始化块详解及实例代码

    这篇文章主要介绍了Java中初始化块详解及实例代码的相关资料,在Java中,有两种初始化块:静态初始化块和非静态初始化块,需要的朋友可以参考下
    2017-03-03
  • spring 整合JDBC和AOP事务的方法

    spring 整合JDBC和AOP事务的方法

    这篇文章主要介绍了spring 整合JDBC和AOP事务的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java中的synchronized重量级锁解析

    Java中的synchronized重量级锁解析

    这篇文章主要介绍了Java中的synchronized重量级锁解析,内核需要去申请这个互斥量,必须要进入内核态,也就是这里需要用户态,内核态的切换,状态的切换,开销是比较大的,这就是重型锁的一个弊端,需要的朋友可以参考下
    2024-01-01
  • Spring Boot Actuator未授权访问漏洞的问题解决

    Spring Boot Actuator未授权访问漏洞的问题解决

    Spring Boot Actuator 端点的未授权访问漏洞是一个安全性问题,可能会导致未经授权的用户访问敏感的应用程序信息,本文就来介绍一下解决方法,感兴趣的可以了解一下
    2023-09-09
  • 详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    详解spring boot集成ehcache 2.x 用于hibernate二级缓存

    本篇文章主要介绍了详解spring boot集成ehcache 2.x 用于hibernate二级缓存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • IDEA自定义pom依赖的步骤详解

    IDEA自定义pom依赖的步骤详解

    这篇文章主要介绍了IDEA自定义pom依赖的步骤详解,本文分步骤通过图文并茂的形式给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • Spring初始化与销毁顺序案例演示详解

    Spring初始化与销毁顺序案例演示详解

    这篇文章主要介绍了SpringBoot中的Bean的初始化与销毁顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论