hibernate 三种状态的转换

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日

相关文章

  • java环境中的JDK、JVM、JRE详细介绍

    JDK、JVM、JRE介绍 在学习Java编程语言时,经常会听到JDK、JVM、JRE这几个概念。那么,这些概念的具体含义是什么呢? JDK(Java Development Kit):Java开发工具包。JDK是Java开发的核心组件,包含了Java编译器、Java运行环境、Java类库等一系列组件。 JRE(Java Runtime Environmen…

    Java 2023年5月24日
    00
  • 原因分析IDEA导入Spring-kafka项目Gradle编译失败

    下面是详细的攻略: 问题背景 在开发Spring-kafka项目时,使用IDEA作为开发工具进行import后,进行Gradle编译时会出现失败。导致编译失败的原因主要有以下几个方面: IDEA默认所使用的Gradle版本与项目Gradle版本不一致,导致编译报错 缺少项目依赖的jar包或者版本不匹配 项目配置文件配置有误 解决方案 方案一:更改Gradle…

    Java 2023年5月20日
    00
  • java获取IP归属地全网显示开源库使用

    获取IP归属地是许多Web开发、网络安全等领域的必备技能,实现这一功能需要使用到一些开源的库。本文将介绍Java获取IP归属地全网显示开源库的使用方法,包含如下内容: IP归属地库的选择 库的安装和配置 如何使用库获取IP归属地 示例说明 IP归属地库的选择 在Java中获取IP归属地需要使用第三方库,常见的库有GeoLite2和ip2region等。这些库…

    Java 2023年5月26日
    00
  • 精确查找PHP WEBSHELL木马的方法(1)

    精确查找PHP WEBSHELL木马的方法(1)攻略 查找PHP WEBSHELL木马一直是网络安全工作者的必备技能之一,本文将介绍一些精确查找PHP WEBSHELL木马的 方法,以帮助网络安全工作者更好地发现和处理木马。 1. 根据木马特征字符串查找 检查服务器上各个网站的PHP文件,可以在其文件头或尾巴查找PHP木马中常用的特征字符串来发现有无木马文件…

    Java 2023年6月15日
    00
  • 详解Java多线程编程中互斥锁ReentrantLock类的用法

    详解Java多线程编程中互斥锁ReentrantLock类的用法 简介 Java多线程编程中,为了保证线程安全,需要保证同一时间只有一个线程访问共享资源。使用互斥锁可以实现这个目的。在Java中,ReentrantLock类提供了互斥锁的功能。 ReentrantLock是可重入的互斥锁,它允许线程重复地获取同一把锁,而不会造成死锁。与synchronize…

    Java 2023年5月19日
    00
  • 浅谈JAVA中输入输出流实例详解

    浅谈JAVA中输入输出流实例详解 Java中的输入输出流(IO流)是指用于处理与设备或文件之间的输入输出的一组类和接口。Java中的IO流分为输入流和输出流,输入流主要是将数据从文件或其他设备读入到内存中,输出流主要是将数据从内存中写入到文件或其他设备中。 Java中的输入输出流分类 Java中的输入输出流可以分为四类: 字节流:以字节为单位进行数据传输。字…

    Java 2023年5月26日
    00
  • JavaScript中${pageContext.request.contextPath}取值问题及解决方案

    “JavaScript中${pageContext.request.contextPath}取值问题及解决方案”的完整攻略如下: 问题说明 在JSP页面中,如果要在JavaScript代码中获取当前web应用的上下文路径,一种常见的写法是${pageContext.request.contextPath}。例如,下面的代码展示了在JSP页面中如何使用该变量:…

    Java 2023年6月15日
    00
  • Java 内置Http Server构建web应用案例详解

    我来详细讲解一下如何使用Java内置Http Server构建Web应用的攻略。 1. 前置知识 在学习Java内置Http Server构建Web应用之前,需要掌握以下技能: Java基础语法 Maven项目构建和管理 HTTP协议的基础知识 Servlet和JSP技术的基础知识 2. 环境搭建 为了使用Java内置Http Server构建Web应用,我…

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