Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用
Hibernate中po对象的三种状态分析
更多相关推荐 hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以便区别:
一、预备知识:
在所有之前,说明一下,对于hibernate,它的对象有三种状态,transient、persistent、detached
可以参考http://easyworld.iteye.com/blog/221616这篇文章
脱管状态的实例可以通过调用save()、persist()或者saveOrUpdate()方法进行持久化。
持久化实例可以通过调用 delete()变成脱管状态。通过get()或load()方法得到的实例都是持久化状态的。
脱管状态的实例可以通过调用 update()、0saveOrUpdate()、lock()或者replicate()进行持久化。
save()和persist()将会引发SQL的INSERT,delete()会引发SQLDELETE,而update()或merge()会引发SQLUPDATE.对持久化(persistent)实例的修改在刷新提交的时候会被检测到,它也会引起SQLUPDATE.saveOrUpdate()或者replicate()会引发SQLINSERT或者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还是托管状态。
/**
* 测试Merge的第一种用法
* if there is a persistent instance with the same identifier currently associated with the session, copy the state
* of the given object onto the persistent instance
*/
public void testMergeOne(){
Test test1 = testService.getTestDao().findById(1); //Session1: 读取ID为1的Object
endTransaction();
test1.setName("数据1"); //在Session之外改变这个值
startNewTransaction(); //Session2
Test test2 = testService.getTestDao().findById(1); //Session2: 读取ID为1的Object
/**
* 将从Session1读取且在Session之外更改后的Object关联到当前Session
* 因为ID相同 所以覆盖test2之中的Name属性的值
*/
testService.getTestDao().merge(test1);
test1.setName("数据1已更改");
setComplete(); //Junit中 不调用roallback
endTransaction();
System.out.println("Test1 Name:"+test1.getName());
System.out.println("Test2 Name:"+test2.getName());
}
输出结果为:
Test1 Name:数据1已更改
Test2 Name:数据1
saveOrUpdateCopy是classic里面的 已经被Merge取代了。
虽然明白怎么用Merge了,不过还是不明白在什么情况下需要用Merge。 谁能告诉我一下?
六、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基础知识积累** Hibernate是一个强大的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是底层的数据存取细节。本篇将深入探讨Hibernate的核心概念、配置、对象关系映射...
10. **最佳实践与实战经验**:分享作者在实际项目中积累的Hibernate使用经验和最佳实践,帮助读者避免常见错误,提高代码质量。 通过阅读《Hibernate in Action》中文版,Java开发者不仅可以掌握Hibernate的使用...
这暗示了源码阅读是需要耐心和毅力的过程,但最终能够带来深厚的技术积累。 关于"java源码"的标签,表明我们要研究的是用Java语言编写的代码,这包括类、接口、方法等Java编程元素。Hibernate的源码是用Java实现的...
8. **最佳实践**:分享了一些在实际开发过程中积累的最佳实践案例。 ### 结论 综上所述,这份Hibernate中文参考文档是一份非常有价值的资料,对于想要学习和使用Hibernate框架的开发者来说尤其有用。通过阅读这份...
这两份笔记可能由经验丰富的开发者整理,包含他们在学习和使用Hibernate过程中积累的实用技巧和常见问题解决方案。这些个人经验往往能提供独特的视角和实战经验,对于解决实际问题非常有价值。 通过这些资料的学习...
**hibernate入门** Hibernate 是一个强大的Java持久化框架,它简化了数据库操作,使得开发者无需直接编写SQL语句即可实现对象与关系数据库...随着经验的积累,你将能够熟练地运用Hibernate解决更复杂的数据访问问题。
让我们深入探讨一下Hibernate Annotation API及其相关的知识点。 **1. Hibernate 注解概述** 在传统的Hibernate配置中,我们通常使用XML文件来描述对象-关系映射。然而,随着Java注解的引入,我们可以直接在实体类...
Hibernate 3.2是Java开发中的一个关键框架,主要用于简化对象关系映射(ORM)的任务。这个核心包包含了实现ORM功能所需的所有基本组件,使得开发者能够将Java类与数据库表进行映射,从而在Java应用中操作数据库变得...
**J2EE复习积累(六)-Hibernate4.2** 在J2EE开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了Java应用程序与数据库之间的交互。本篇复习将聚焦于Hibernate 4.2版本,该版本在前一版本的基础上...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。...随着经验的积累,逐渐深入学习高级特性,如查询优化、缓存和事务管理,以提升项目的效率和质量。
- 在遇到反向工程相关问题时,可通过搜索网络资源、阅读官方文档或查看MyEclipse社区来寻求帮助。 - 记录和分享遇到的问题及解决方案,有助于个人经验的积累,也可以帮助到其他开发者。 以上是关于在MyEclipse中...
标题"hibernate开发包"表明这是一个与Hibernate相关的资源集合,Hibernate是一个流行的Java对象关系映射(ORM)框架,用于简化数据库交互。它将数据库操作转换为面向对象的代码,使开发者可以更专注于业务逻辑而不是...
通过这个教程,学习者可以逐步掌握Hibernate的基本使用方法,并积累实际项目经验。 5. ** SINOLIFE-TRA-HIBERNATE.ppt** 这很可能是一份PPT形式的培训资料,可能包含更直观的图表和案例,便于理解。可能涵盖了...
### Hibernate 使用手册知识点详解 #### 一、简介 Hibernate 是一款免费开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 应用程序中...对于进一步深入学习,建议查阅官方文档和相关教程,不断实践和积累经验。
MyEclipse作为强大的Java开发工具,提供了对Hibernate的支持,用户可以通过其内置的 wizards 快速创建Hibernate项目和相关配置。 1. **项目配置**:首先,要在MyEclipse中创建一个新的Java项目,并添加Hibernate库...
压缩包中的"chapter2"可能是包含示例代码或者教程的目录,通过这些实例,你可以动手实践上述理论知识,加深理解并积累经验。 总之,Hibernate 2.1作为早期的ORM框架版本,尽管功能相对有限,但足以让我们掌握ORM的...
在我一年半的开发经验中,我逐渐积累了对Hibernate的深入理解和实用技巧,现在就与大家分享一下这些关键知识点。 首先,我们要理解Hibernate的核心概念:实体(Entity)、持久化(Persistence)、会话(Session)和...
【标题】"struts+spring+hibernate租房项目"是一个基于JavaEE技术栈的实战应用,它结合了...通过这个项目,开发者可以深入理解JavaEE应用的开发流程,提升综合运用三大框架的能力,为今后的项目开发积累宝贵经验。
随着经验的积累,可以进一步研究性能调优和第三方集成,以提高项目的稳定性和效率。 总结,Hibernate API和文档是Java开发者的宝贵资源,它们不仅提供了丰富的功能,还有详尽的指导。通过深入学习和实践,开发者...
教师相关的Action会通过Hibernate查询学生选课数据,然后返回给Struts2的Result,再由模板引擎渲染成视图展示给教师。教师可以据此了解学生的选课情况,以便进行教学安排。 对于学生来说,系统的核心功能是选修课程...