hibernate 三种状态的转换

yizhihongxing

Hibernate是一个Java语言的ORM(Object-Relational Mapping)框架,用来方便地进行数据库操作。在Hibernate中,每一个对象都有它自己的状态,状态对Hibernate来说非常重要。Hibernate中的实体状态一共有三种,他们是瞬时态、持久态、游离态,下面让我们详细来解释一下这三种状态。

瞬时态

瞬时态是指,一个对象未被持久化的状态,即我们通过new关键字创建了一个新的对象,但还没有将它持久化到数据库中。这种状态的对象没有与数据库中的任何记录产生关联,当我们调用session.save()进行持久化操作之后,该对象就会从瞬时态转换到持久态。

示例1:创建新的Person对象并持久化到数据库

Person person = new Person(); // 创建了一个新的Person对象
person.setName("Tom");
person.setAge(18);
session.save(person); // 将该对象持久化到数据库中

示例2:从数据库中读取一个对象并修改其属性值

Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
person.setName("Jack"); // 修改对象属性值

在示例2中,虽然我们对person对象进行了属性的修改,但是由于该对象是从数据库中读取出来的持久态对象,所以当我们调用session的flush()方法后,Hibernate会自动将修改后的属性值同步到数据库中。

持久态

持久态是指,一个对象已经被保存到数据库中并与数据库中的记录关联起来的状态。这种状态的对象被Session进行管理,并且在Session缓存中有相应的记录。当我们修改了该对象的属性时,Hibernate会为我们自动更新数据库中对应的记录。

示例1:从数据库中读取一个对象并修改其属性值

Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
person.setName("Jack"); // 修改对象属性值

在示例1中,我们从数据库中读取出id为1的Person对象,并且修改了它的姓名属性,由于该对象是持久态对象,Hibernate会为我们自动更新数据库中对应的记录。

示例2:将对象从持久态变为游离态

Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
session.evict(person); // 将该对象从Session缓存中清除,并且变为游离态对象

在示例2中,我们通过调用Session的evict()方法,将对象person从Session缓存中清除,并且将其变为游离态对象。此时该对象已经与Session失去了关联,对该对象的任何操作都不会被Hibernate自动进行同步到数据库中。

游离态

游离态是指,一个对象已经被持久化到数据库中,但是它已经不被Session所管理的状态。当我们从Session缓存中将持久态对象清除时,它就会变成游离态对象。此时该对象已经与Session失去了关联,对该对象的任何操作都不会被Hibernate自动进行同步到数据库中。当我们再次将该对象重新与Session关联起来时,该对象变成持久态对象。

示例1:将对象从持久态变为游离态

Person person = session.get(Person.class, 1); // 从数据库中读取id为1的Person对象
session.evict(person); // 将该对象从Session缓存中清除,并且变为游离态对象

在示例1中,我们通过调用Session的evict()方法,将对象person从Session缓存中清除,并且将其变为游离态对象。此时该对象已经与Session失去了关联,对该对象的任何操作都不会被Hibernate自动进行同步到数据库中。

示例2:将游离态对象重新变为持久态对象

Person person = new Person(); // 创建一个新的Person对象
person.setId(1); // 设置该对象的id属性
person.setName("Tom"); // 设置该对象的name属性
person.setAge(18); // 设置该对象的age属性
session.update(person); // 将该对象重新与Session建立关联,并将其更新到数据库中

在示例2中,我们创建了一个新的Person对象,并且将其设置为游离态对象。接着,我们通过调用Session的update()方法,将该对象重新与Session建立关联,并且将其更新到数据库中,此时该对象变成持久态对象。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:hibernate 三种状态的转换 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • Spring Security密码解析器PasswordEncoder自定义登录逻辑

    下面是详细讲解“Spring Security密码解析器PasswordEncoder自定义登录逻辑”的完整攻略: 1. 理解PasswordEncoder和其实现类 PasswordEncoder是Spring Security中的一个接口,用于加密和解密用户登录密码,在用户登录过程中用于比对用户输入的密码和数据库中存储的加密后的密码是否一致。 Sprin…

    Java 2023年5月20日
    00
  • Java 字符串反转实现代码

    我来详细讲解一下“Java 字符串反转实现代码”的攻略。 什么是字符串反转 字符串反转是指将一个字符串的顺序颠倒过来,即从后往前读取原字符串。比如,将字符串“hello”反转后得到的字符串为“olleh”。 字符串反转的实现方法 Java 中字符串是不可变的对象,因此不能直接对字符串进行反转。我们可以通过将字符串转换为字符数组,并且进行字符数组的反转,最后再…

    Java 2023年5月27日
    00
  • MyBatis控制台显示SQL语句的方法实现

    下面是 “MyBatis控制台显示SQL语句的方法实现” 的完整攻略: 1. 添加MyBatis配置文件 在 application.properties 或 mybatis-config.xml 文件中声明 MyBatis 显示 SQL 的配置。在 mybatis-config.xml 中的 \<configuration> 节点内添加如下配置…

    Java 2023年5月20日
    00
  • Sprint Boot @JsonFormat使用方法详解

    @JsonFormat是Spring Boot中的一个注解,用于指定Java对象在序列化为JSON字符串时的日期格式。在本文中,我们将详细介绍@JsonFormat注解的作用和使用方法,并提供两个示例。 @JsonFormat注解的作用 @JsonFormat注解用于指定Java对象在序列化为JSON字符串时的日期格式。当使用@JsonFormat注解标记一…

    Java 2023年5月5日
    00
  • JSP开发中hibernate框架的常用检索方式总结

    JSP开发中Hibernate框架的常用检索方式总结 在Java Web开发中,使用Hibernate框架来操作数据库是非常常见的。有时候我们需要进行数据检索,本篇文章将总结Hibernate中常用的检索方式。 HQL Hibernate Query Language,简称HQL,是Hibernate提供的一种面向对象的检索语言。 基本查询 from Ent…

    Java 2023年6月15日
    00
  • 利用Lambda表达式创建新线程案例

    利用Lambda表达式创建新线程案例的完整攻略: 1. 创建新线程的步骤 创建新线程通常包含以下几个步骤: 定义线程要执行的任务:在实现Runnable接口的run()方法中编写线程任务的逻辑。 创建线程对象:使用线程类(Thread)的构造函数创建线程对象。 启动线程:使用线程对象的start()方法启动线程。 以上三个步骤可以用Lambda表达式简化为一…

    Java 2023年5月19日
    00
  • Struts2数据输入验证教程详解

    Struts2数据输入验证教程详解 什么是数据输入验证 在应用程序中,数据输入验证是一项重要的任务。它可以确保应用程序接受有效的、可靠的和正确的数据。数据输入验证通常采用静态和动态验证技术,在前台和后台进行验证。 静态验证技术用于验证数据格式是否为正确的格式,比如数字、日期等。而动态验证技术则用于验证数据是否是符合业务规则和逻辑的,例如输入的身份证号码必须符…

    Java 2023年5月20日
    00
  • 详解Java实现拓扑排序算法

    详解Java实现拓扑排序算法 什么是拓扑排序算法 拓扑排序算法是一种用来解决有向图中节点之间依赖关系问题的算法,它可以将有向无环图(DAG)中的所有节点按照一定的规则排序,可以用来确定一组任务的执行顺序,比如编译器可以用拓扑排序来确定源代码的编译顺序。 拓扑排序算法原理 拓扑排序算法基于DAG图,DAG图中每个节点表示一个任务,有向边表示任务之间的依赖关系,…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部