http://www.gzhuashun.cn/newsinfo/news_7_671.html
save,persist,update,saveOrUpdte,merge,flush,lock)及 对象的三种状态
hibernate的保存
hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别。
一、预备知识
在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
(new DeptPo(1,”行政部”,20,”行政相关”),该po的实例和session没有关联,该po的实例处于transient)
persistent:持久化状态
(和数据库中记录想影射的Po实例,它的状态是persistent, 通过get和load等得到的对象都是persistent)
detached:脱管状态或者游离态
(1)
当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该po状态就处于
detached, (表示和session脱离关联),因delete而变成游离态可以通过save或saveOrUpdate()变成持久态
(2)当把session关闭时,session缓存中的persistent的po对象也变成detached
因关闭session而变成游离态的可以通过lock、save、update变成持久态
持久态实例可以通过调用 delete()变成脱管状态。
通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用lock()或者replicate()进行持久化。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,
而update()或merge()会引发SQL UPDATE。对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL UPDATE。
saveOrUpdate()或者replicate()会引发SQLINSERT或者UPDATE
二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象或自由态对象(一定要和一个记录对应)更新到数据库
三、update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段话来解释他们的使用场合和区别
通常下面的场景会使用update()或saveOrUpdate():
程序在第一个session中加载对象,接着把session关闭
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层最终到持久层
程序创建第二session调用第二个session的update()方法持久这些改动
saveOrUpdate(po)做下面的事:
如果该po对象已经在本session中持久化了,在本session中执行saveOrUpdate不做任何事
如果savaOrUpdate(新po)与另一个与本session关联的po对象拥有相同的持久化标识(identifier),抛出一个异常
org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
saveOrUpdate如果对象没有持久化标识(identifier)属性,对其调用save() ,否则update() 这个对象
四、persist和save区别
这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference文档中也没有明确的区分他们.
这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
主要内容区别:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符(identifier主键对应的属性)被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时候。
2,save, 把一个瞬态的实例持久化标识符,及时的产生,它要返回标识符,所以它会立即执行Sql insert
五、saveOrUpdate,merge和update区别
比较update和merge
update的作用上边说了,这里说一下merge的
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象覆盖session已有的持久实例
(1)当我们使用update的时候,执行完成后,会抛出异常
(2)但当我们使用merge的时候,把处理自由态的po对象A的属性copy到session当中处于持久态的po的属性中,执行完成后原来是持久状态还是持久态,而我们提供的A还是自由态
六、flush和update区别
这两个的区别好理解
update操作的是在自由态或脱管状态(因session的关闭而处于脱管状态)的对象//updateSQL
而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象的改动(包含set容器)是不需要update的,只要你更改了对象的值,等待hibernate flush就自动更新或保存到数据库了。hibernate flush发生在以下几种情况中:
1, 调用某些查询的和手动flush(),session的关闭、SessionFactory关闭结合
get()一个对象,把对象的属性进行改变,把资源关闭。
2,transaction commit的时候(包含了flush)
七、lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态(针对的是因Session的关闭而处于脱管状态的po对象(2),不能针对因delete而处于脱管状态的po对象)
对应更改一个记录的内容,两个的操作不同:
update的操作步骤是:
(1)属性改动后的脱管的对象的修改->调用update
lock的操作步骤是:
(2)调用lock把未修改的对象从脱管状态变成持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
八、clear和evcit的区别
clear完整的清除session缓存
evcit(obj)把某个持久化对象从session的缓存中清空。
session.lock(xtyhb,LockMode.NONE);//表示直接到缓存中去找变成持久态的对象
session.lock(xtyhb,LockMode.READ);//先通过ID读数据库该记录的ID看是否有该记录,如果有接着到缓存中去找变成持久态的对象
分享到:
相关推荐
在本篇《Hibernate源码解析(二)》中,我们将深入探讨Hibernate这一强大的Java对象关系映射(ORM)框架的内部工作原理。这篇博客旨在帮助开发者更好地理解Hibernate的核心机制,以便于更高效地利用它来处理数据库...
**Hibernate原理解析** Hibernate是一个开源的Java语言下的对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作与业务逻辑解耦,使得代码更加...
- **hibernate3.jar**: 这是一个Java档案文件,包含预编译的Hibernate 3类和资源,可以直接在Java应用中使用,作为依赖来执行ORM(对象关系映射)任务。 - **hibernate3-src.zip**: 这是一个ZIP文件,通常包含...
在Hibernate中,对象有三种状态:瞬时态、持久态和脱管态。理解这些状态对于正确操作对象至关重要,例如,只有持久态对象才能参与事务。 六、缓存机制 Hibernate 3.2引入了二级缓存,通过CacheProvider实现,如...
《Hibernate3中文手册》是Java开发领域中关于对象关系映射框架Hibernate的重要参考资料,它详尽地阐述了Hibernate3的使用方法和核心概念。Hibernate是一个开放源代码的对象关系映射框架,它允许开发者将数据库操作与...
下面将对 Hibernate3 的源代码进行深入解析,探讨其中的关键组件和工作原理。 1. **实体管理(Entity Management)** - **SessionFactory**: 这是 Hibernate 的核心,负责创建 Session 对象。SessionFactory 是...
7. **实体生命周期**:了解Hibernate如何处理对象的创建、更新、删除等状态变化。 8. **性能调优**:包括批处理、连接池配置、查询优化等方面的知识。 9. **拦截器和事件监听器**:学习如何自定义行为,比如在对象...
3. Hibernate工作流程 - 加载配置:程序启动时,通过Configuration读取配置文件,设置数据库连接等参数。 - 创建SessionFactory:基于配置信息,Configuration实例化SessionFactory。 - 获取Session:...
4. 对象状态:Hibernate中的对象有四种状态:瞬时态、持久态、脱管态和临时态,理解这些状态有助于更好地管理对象的生命周期。 5. 第二级缓存:除了默认的一级缓存外,Chapter 3可能涉及启用和配置第二级缓存,提高...
总的来说,《Hibernate中文参考手册》详细解析了Hibernate的各个组件和使用方法,包括配置、实体映射、数据查询、事务管理以及缓存策略,为Java开发者提供了全面的学习指南,帮助他们更好地理解和运用这一强大的ORM...
3. **Session**:在Hibernate中,Session是对象与数据库交互的主要接口,负责管理对象的状态,执行CRUD(创建、读取、更新、删除)操作。 4. **Criteria查询**:除了标准的SQL查询,Hibernate还提供了Criteria API...
《Hibernate技术深度解析:中文文档与实战指南》 在Java世界中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。本文将深入探讨Hibernate的核心概念,结合提供的中文文档,以及...
Hibernate 中的实例状态可以分为三种:transient、persistent 和 detached。transient 状态表示对象尚未被保存到数据库,persistent 状态表示对象已经被保存到数据库,而 detached 状态表示对象已经被从数据库中删除...
**Hibernate 框架全面解析** Hibernate 是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务,将数据库操作转换为对Java对象的操作,从而简化了开发过程。这个CHM文档集合包含了丰富的...
3. **持久化管理**:持久化是ORM中的一个重要概念,本书探讨了如何有效地管理实体对象的状态变化,如瞬时状态、持久状态等。 4. **缓存机制**:为了提高性能,Hibernate支持多种缓存策略,书中详细介绍了如何合理地...
3. **游离状态**:已持久化的对象如果脱离了Session的管理,但仍然有标识符,就会进入游离状态。此时,对象的修改不会自动更新到数据库,需要重新加入Session才能持久化。 四、Hibernate的缓存机制 为了提高性能,...
- **4.2 persistent(持久化状态)**: 表示对象已被持久化,即有一个对应的数据库记录,并且与Session建立了关联,此时Hibernate会自动同步对象的状态和数据库中的记录。 - **4.3 detached(游离状态)**: 表示对象...
### Hibernate 3.x 参考手册关键知识点解析 #### 一、快速入门与Tomcat集成 **1.1 快速开始使用 Hibernate** - **环境准备:** - 使用 Hibernate 前需确保 Java 环境已安装配置。 - 下载 Hibernate 3.x 版本库...