hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:
一、预备知识:
在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态 ,不曾进行持久化,未与任何Session相关联
persistent:持久化状态 ,仅与一个Session相关联
detached:脱管状态或者游离态 ,已经进行过持久化,但当前未与任何Session相关联
瞬态或者自由态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
持久化状态实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。
脱管状态或者游离态的实例可以通过调用 update()、saveOrUpdate()、lock()或者replicate()进行持久化。
游离或者自由状态下的实例可以通过调用merge()方法成为一个新的持久化实例。
save()和persist()将会引发SQL的INSERT,
delete()会引发SQLDELETE,
而update()或merge()会引发SQL的UPDATE.
对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQL的UPDATE.
saveOrUpdate()或者replicate()会引发SQL的INSERT或者UPDATE
二、save 和update区别
把这一对放在第一位的原因是因为这一对是最常用的。
save的作用是把一个新的对象保存
update是把一个脱管状态的对象保存
三、update 和saveOrUpdate区别
这个是比较好理解的,顾名思义,saveOrUpdate基本上就是合成了save和update引用hibernate reference中的一段话来解释他们的使用场合和区别。
通常下面的场景会使用update()或saveOrUpdate():
程序在第一个session中加载对象
该对象被传递到表现层
对象发生了一些改动
该对象被返回到业务逻辑层
程序调用第二个session的update()方法持久这些改动
saveOrUpdate()做下面的事:
如果对象已经在本session中持久化了,不做任何事
如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常
如果对象没有持久化标识(identifier)属性,对其调用save()
如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()
如果对象是附带版本信息的(通过或) 并且版本属性的值表明其是一个新实例化的对象,save()它。
四、persist和save区别
这个是最迷离的一对,表面上看起来使用哪个都行,在hibernate reference文档中也没有明确的区分他们。
这里给出一个明确的区分。(可以跟进src看一下,虽然实现步骤类似,但是还是有细微的差别)
1.persist把一个瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间。
2.persist"保证",当它在一个transaction外部被调用的时候并不触发一个Sql Insert,这个功能是很有用的,当我们通过继承Session/persistence context来封装一个长会话流程的时候,一个persist这样的函数是需要的。
3.save"不保证"第2条,它要返回标识符,所以它会立即执行Sql insert,不管是不是在transaction内部。
五、saveOrUpdateCopy,merge和update区别
首先说明merge是用来代替saveOrUpdateCopy的,然后比较update和merge,update的作用上边说了,这里说一下merge的作用。
如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例,最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管的
重点是最后一句:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态
但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到一个持久对象,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。
六、flush和update区别
这两个的区别好理解
update操作的是在脱管状态的对象,而flush是操作的在持久状态的对象。
默认情况下,一个持久状态的对象是不需要update的,只要你更改了对象的值,等待hibernate flush就自动保存到数据库了。hibernate flush发生再几种情况下:
1.调用某些查询的时候
2.transaction commit的时候
3.手动调用flush的时候
七、lock和update区别
update是把一个已经更改过的脱管状态的对象变成持久状态
lock是把一个没有更改过的脱管状态的对象变成持久状态
对应更改一个记录的内容,两个的操作不同:
update的操作步骤是:
更改脱管的对象->调用update
lock的操作步骤是:
调用lock把对象从脱管状态变成持久状态——>更改持久状态的对象的内容——>等待flush或者手动flush
分享到:
相关推荐
Hibernate Web应用的开发一般经过以下几个步骤: (1)创建数据库。 (2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从...
hibernate3应用实例hibernate3应用实例hibernate3应用实例hibernate3应用实例
在这个“javahibernate应用举例”中,我们将深入探讨如何利用Hibernate简化Java中的SQL操作,以及如何实现数据的查找和保存功能。 首先,Hibernate通过提供一个API,使得开发人员无需直接编写SQL语句就能进行数据...
"hibernate 常用核心包"包含了 Hibernate 框架中必要的组件,使得开发者可以进行基本的数据库操作和应用程序开发。 在 Hibernate 中,以下几个核心包是至关重要的: 1. **hibernate-core**: 这是 Hibernate 的核心...
Hibernate应用及其详解
**Hibernate应用详解** ...通过这个小应用,你可以学习到如何在实际项目中集成和使用Hibernate,包括配置、对象持久化、查询等基本操作。理解并熟练掌握Hibernate,能显著提升Java应用程序的开发效率和可维护性。
以下是 Hibernate 中对象的三种状态以及相关的保存方法: 1. **瞬时对象(Transient Objects)** - 当使用 `new` 关键字创建一个对象时,它处于瞬时状态。这种状态的对象与数据库中的任何记录没有关联,只存在于...
在当今的IT行业中,Eclipse作为一个开源的集成开发环境(IDE),广泛应用于Java语言的开发,而Hibernate作为一个对象关系映射(ORM)框架,使Java程序员能够以面向对象的方式来操作关系型数据库。Hibernate通过映射...
在第二章中,作者可能会详细讲解Hibernate的核心概念,包括ORM(对象关系映射)的基本理念,以及为什么在Java应用中选择Hibernate作为持久化框架。这一章会涉及如何安装和配置Hibernate,包括设置hibernate.cfg.xml...
在Hibernate中,Clob类型的字段通常有两种处理方式: 1. **传统JDBC方式**: 在这种模式下,开发者需要直接操作Clob对象,通过PreparedStatement的setClob方法设置Clob值,通过ResultSet的getClob方法获取Clob值。...
java开发过程中hibernate的应用
在这个“简单的Hibernate应用”中,我们将探讨Hibernate的基本概念、核心组件以及如何在实际项目中应用。 1. Hibernate概览:Hibernate是一个开源的ORM框架,它提供了一种在Java应用程序中管理关系数据库的机制。...
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...
`HibernateSessionFactory` 类是Hibernate应用中常见的一个工具类,用于管理和提供与当前线程相关的Session实例。让我们详细了解一下`HibernateSessionFactory`类中的关键方法和其背后的原理。 1. **配置和初始化...
《Hibernate应用开发完全手册(源码)》是针对Java开发者深入理解Hibernate框架的重要参考资料,它提供了详尽的源码分析,帮助开发者从实践层面深化对Hibernate的理解。Hibernate是一个开源的对象关系映射(ORM)...
本文将详细解析Hibernate框架中常用的jar包及其功能,以便开发者更好地理解和应用。 首先,我们关注到“antlr-2.7.6.jar”。ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、...
以下是对标题、描述中提到的Hibernate常用jar包的详细解释: 1. **antlr-2.7.6**: ANTLR(ANother Tool for Language Recognition)是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件。...
基于Struts_Hibernate构架的数字化教学评估档案管理系统
Hibernate Search是Hibernate框架的一个扩展,它允许我们在应用程序中实现全文检索功能,使得数据库中的数据可以被快速、高效地搜索。这个功能尤其在处理大量文本数据时非常有用,比如在电商网站的商品搜索或者新闻...
Oracle的Clob数据类型在数据库中用于存储大对象(Large Object),如长文本、XML文档等大量字符数据。...理解并熟练掌握Clob在Hibernate中的处理方式,对于开发高效且稳定的数据库应用程序至关重要。