Hibernate 中对象的状态:
在Java中,当new了一个对象时,该对象的生命周期就开始了,当没有一个变量引用它的时候,他的生命周期
也就随之而结束,Java垃圾回收器就会清理被它占用的内存。
在Hibernate中,对于需要被持久化的对象,在它的生命周期中有三种状态:
临时态 transient:(也叫 瞬时态,自由态)刚刚创建出来的对象,还没有被持久化,不处于Session的缓存当中,
处于临时状态的Java对象被称为 临时对象。
持久化状态 persistent:已经被持久化的对象,已经加入到Session的缓存当中,与数据库记录对应
的Java对象称为 持久化对象。
游离状态 detached :(也叫 脱管态)已经被持久化,但不存在与 Session 的缓存当中处于游离态的
对象,称为游离态对象。
方法对应对象的不同状态:
new,delete 临时状态(瞬时态,自由态)
save 转变为持久化状态
update,load,get,saveOrUpdate,lock,find,iterate... 处于持久化状态
close,clear,evict 转变为 游离态(脱管态)
临时态:
不属于任何一个Session的缓存,数据库中无记录与之对应。
new语句创建的对象处于临时状态
delete 是一个 持久化 或 游离态 的对象变为 临时态。
delete 方法将 游离态 对象对应的数据库记录删除。
delete 方法将 持久化 对象对应的数据库记录删除,并且从Session的缓存中移除。
持久化状态:
处于一个Session的缓存当中,与数据库中的一条记录对应。
Session在清理缓存时,会根据对象状态的变化来更新到数据库。
save方法 将 临时态对象 转化为 持久态对象。
load,get,find 方法从数据库中查询对象,这些对象都是持久化状态的对象。
update,saveOrUpdate,lock 方法将 游离态 对象转化为 持久态对象。
当一个持久态对象关联一个临时对象,在允许级联保存的情况下,Session在清理缓存时,会将
所关联的临时态的对象也转变为持久态对象。
对于两个Session,即使两个Session中存在与同一条数据库记录对应的对象,因为它们存在于不同的
Session中它们的内存地址是不相同的。
如果两个Session共同处理同一个对象,就会发生重复的操作。
Person p1 = session1.get(Person.class, 1);
session2.update(p1);
p1.setName("new Name");
session1.commit();
session2.commit();
这样会生成两个update的SQL语句,对于Session1在提交事物时会根据对象改变的状态来生成SQL语句。
对于Session2来说,p1是处于Session1的缓存中还没有与Session2关联,因此对于Session2 来说,p1
还处于游离态。当Session2调用 update方法与p1发生关联时,p1也会变成 Session2 中的持久化状态。
接着改变了p1的状态,那么Session2在提交的时候也会根据改变的状态生成相应的SQL语句。
在实际的应用程序中,我们应该避免这样的情况出现,应为一个对象与两个Session关联,会导致
冗余的SQL,而且还会引发一些不必要的错误。
游离状态:
游离状态的对象不与Session发生关联。
游离状态的对象是由持久态转化而来的,因此在没有其它程序删除该条记录的情况下还是有与之对应的
数据库记录。
游离对象 与 临时对象 相同之处在于,都没有与之关联的Session对象,因此Hibernate不会保证它们
的属性变化会同步更新到数据库。
不同之处在于,游离对象是从持久态转变而来的,因此还有可能有与之对应的数据库记录,而临时对象
则没有与之对应的数据库记录。
close 方法会清空Session的缓存,缓存中的所有持久化对象都会编程游离态,如果这时没有任何变量
引用它们,它们就结束了生命周期,会被垃圾回收器清理。
evict 方法能够从缓存中删除一个持久化的对象,使它变为游离态。当Session中关联了大量的持久化
状态的对象时,我们可以及时使用该方法清理掉一些不需要的对象,以节省内存。但不推荐这样操作,
应该通过查询语言或显示的导航来控制对象图的深度。
分享到:
相关推荐
hibernate中session对象的状态详解
在Java开发中,持久化是将应用程序中的对象状态保存到持久存储介质(如数据库)的过程。Hibernate通过提供一种对象-关系映射机制,使得Java对象可以直接与数据库表进行交互,而无需编写大量的SQL语句。这种映射机制...
### Hibernate 三种状态详解 #### 一、引言 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在 Hibernate 中,对象的状态管理是其核心特性之一,主要包括...
在Java应用开发中,对象持久化是一个关键环节,它涉及将程序中的对象状态存储到持久化介质(如关系型数据库)中,并在需要时恢复这些状态。Hibernate作为ORM(对象关系映射)框架,通过提供一种面向对象的方式来处理...
理解Hibernate对象状态对于优化应用性能至关重要,例如,正确地管理Session的生命周期可以减少不必要的数据库交互,提高效率。在处理大量数据时,避免在事务中保留大量持久态对象,可以防止内存溢出。而合理使用脱管...
8.3 Java对象在Hibernate持久化层的状态 8.3.1 临时对象的特征 8.3.2 持久化对象的特征 8.3.3 被删除对象的特征 8.3.4 游离对象的特征 8.4 Session接口的详细用法 8.4.1 Session的save()和persist()...
**Hibernate详解** Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使得开发者无需关注SQL的编写,可以更加专注于业务逻辑。本文将深入探讨Hibernate的核心概念、主要功能以及如何在...
对象在 Hibernate 中可以处于三种状态:临时状态(Transient)、持久化状态(Persistent)和游离状态(Detached)。理解这些状态对于有效使用 Hibernate 进行数据操作至关重要。 1. 临时状态(Transient): 当...
- **概念**:对象持久化是指将程序中的对象状态保存到外部存储介质的过程,以便在系统重启后仍然可以恢复这些对象的状态。 - **实现方式**:在Java中,常见的对象持久化方式包括使用Java序列化机制、XML文件、数据库...
本教程“hibernate:java持久化对象详解02”是系列教程的一部分,它将继续深入探讨Java中的持久化对象与Hibernate的使用方法。在开始之前,建议先学习“hibernate:java持久化对象详解01”,以确保对基础概念有清晰的...
在 Hibernate 中,对象的状态主要包括以下三种: 1. **瞬时态(Transient)**:指新创建的对象尚未与任何 Session 关联,也未被持久化到数据库中。 2. **持久态(Persistent)**:指对象已经被添加到当前 Session ...
【Hibernate缓存深入详解】 在Java的持久化框架Hibernate中,缓存机制是提升系统性能的关键因素。它位于Hibernate应用和数据库之间,减少了对数据库的直接访问,从而提高了应用程序的运行速度。缓存中存储的是...
本教程“hibernate:java持久化对象详解01”聚焦于理解Hibernate如何将Java对象持久化到数据库中。 首先,让我们了解一下什么是持久化对象。在Java中,持久化对象是指那些状态可以被保存到持久存储介质(如数据库)...
8. **实体生命周期**:详解Hibernate对对象状态的管理,包括瞬时态、持久态、游离态和脱管态,以及对象状态转换和事件监听器。 9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、...
例如,当对象的状态发生变化时,Hibernate会自动检测并刷新数据库以保持一致。此外,`Session`还负责事务管理,通过`Transaction`接口实现。在轻量级的Hibernate环境中,事务管理是通过Hibernate自己的API,而不是...
### Hibernate Mapping 参数详解 在 Hibernate 中,为了将 Java 对象映射到数据库表,并实现对象关系映射(ORM),开发者需要定义一系列配置属性来指导 Hibernate 如何进行转换。本文将详细解析 `hibernate-mapping...
#### 四、Hibernate控制下的POJO呈现的三种状态 - **4.1 transient(暂态)**: 表示对象尚未被持久化,即没有对应的数据库记录,也不受Session管理。这种状态的对象通常用于新建的对象,在调用`save()`方法之前处于...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...