- 浏览: 1315262 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (471)
- 原创文章 (4)
- Database (84)
- J2SE (63)
- Web (26)
- Javascript (30)
- Lucene (11)
- os (13)
- 算法 (8)
- Webservice (1)
- Open projects (18)
- Hibernate (18)
- Spring (15)
- Css (2)
- J2ee (2)
- 综合技术 (18)
- 安全管理 (13)
- PatternsInJava (27)
- NIO (5)
- Ibatis (2)
- 书籍收藏 (1)
- quartz (7)
- 并发编程 (15)
- oracle问题 (2)
- ios (60)
- coco2d-iphone (3)
- C++ (6)
- Zookeeper (2)
- golang (4)
- animation (2)
- android (1)
最新评论
-
dandingge123:
【引用】限制UITextField输入长度的方法 -
qja:
...
对List顺序,逆序,随机排列实例代码 -
安静听歌:
现在在搞这个,,,,,哎~头都大了,,,又freemarker ...
通用大型网站页面静态化解决方案(一) -
springdata-jpa:
java quartz定时任务demo教程源代码下载,地址:h ...
Quartz 配置参考 -
马清天:
[b][/b][list][*]引用[u][/u][/list ...
通用大型网站页面静态化解决方案(一)
hibernate的保存
hibernate对于对象的保存提供了太多
的方法,他们之间有很多不同,这里细说一下,以便区别:
一、预备知识:
在所有之前,说明一下,对于hibernate,它的对象有三种状
态,transient、persistent、detached
下边是常见的翻译办法:
transient:瞬态或者自由态
persistent:
持久化状态
detached:脱管状态或者游离态
脱管状态的实例可以通过调用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()
如果对象是附带版本信息的(通过<version>或<timestamp>)
并且版本属性的值表明其是一个新实例化的对象,save()它。
否则update() 这个对象
四,persist和save区别
这个是最迷离的一对,表面上看起来使
用哪个都行,在hibernate reference文档中也没有明确的区分他们.
这里给出一个明确的区分。(可以跟进src看一下,虽然实现
步骤类似,但是还是有细微的差别)
这里参考
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682
中的一个说明:
---------------------------------------------------------------------------------
I
found that a lot of people have the same doubt. To help to solve this
issue
I'm quoting Christian Bauer:
"In case anybody finds this
thread...
persist() is well defined. It makes a
transient instance persistent. However,
it doesn't guarantee that
the identifier value will be assigned to the persistent
instance
immediately, the assignment might happen at flush time. The spec doesn't
say
that, which is the problem I have with persist().
persist() also guarantees that it
will not execute an INSERT statement if it is
called outside of
transaction boundaries. This is useful in long-running conversations
with
an extended Session/persistence context.A method like persist() is
required.
save() does not guarantee the same,
it returns an identifier, and if an INSERT
has to be executed to get
the identifier (e.g. "identity" generator, not "sequence"),
this
INSERT happens immediately, no matter if you are inside or outside of a
transaction. This is not good in a long-running conversation with an
extended Session/persistence context."
---------------------------------------------------------------------------------
简
单翻译一下上边的句子的主要内容:
1,persist把一个瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入可
能被推迟
到flush的时间。
2,persist"保证",当它在一个transaction外部被调用的时
候并不触发一个Sql Insert,这个功能是很有用的,
当我们通过继承Session/persistence
context来封装一个长会话流程的时候,一个persist这样的函数是需要的。
3,save"不保证"第2条,它要返回标识符,所以它会立即执行Sql insert,不管是不是在transaction内部还是外部
五,saveOrUpdateCopy,merge和update区别
首
先说明merge是用来代替saveOrUpdateCopy的,这个详细见这里
http://www.blogjava.net/dreamstone/archive/2007/07/28/133053.html
然后比较update和merge
update的作用上边说了,这里说一下merge的
如
果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例
如果session没有相应
的持久实例,则尝试从数据库中加载,或创建新的持久化实例,最后返回该持久实例
用户给出的这个对象没有被关联到session上,它依旧是脱管
的
重点是最后一句:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态
但当我们使用merge
的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到
一个持久对象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
的操作步骤是:
(1)更改脱管的对象->调用update
lock的操作步骤是:
(2)调用lock把对象从脱管状态变成
持久状态-->更改持久状态的对象的内容-->等待flush或者手动flush
参考内容:
http://www.blogjava.net/iamtin/archive/2006/03/06/33910.aspx
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1682
http://www.redsaga.com/hibernate-ref/3.x/zh-cn/html/objectstate.html
在 Hibernate 3 中,取消了 find() 方法,您必须透过 Query 或 Criteria 来进行数据查询
发表评论
-
hibernate ehcache
2010-12-11 21:57 33271.EhCache是什么 EhCache是Hiberna ... -
全面讲解Hibernate二级缓存
2010-12-02 21:37 1132向大家详细介绍Hibernate ... -
深入理解Hibernate日志
2010-12-02 21:33 1877Hibernate中使用什么来记录日志呢?通常Hibern ... -
Hibernate中悲观锁和乐观锁
2010-12-02 21:19 3241Hibernate悲观锁:在数 ... -
解读Hibernate继承映射策略
2010-12-02 20:33 1063Hibernate继承映射的英文是Inheritanc ... -
mysql的text如何dialect mapping
2010-11-17 12:35 2270在开发项目中,遇到了hibernate 的2个bug。导致 ... -
让hibernate支持date_add
2010-11-17 12:30 5135今天做东西的时候想 ... -
Hibernate3一级缓存和二级缓存的理解!
2010-11-04 20:06 16661. Session 级别的缓存,它同 ... -
Hibernate的缓存机制
2010-10-26 21:24 1246核心提示:缓存是位于应用程序与物理数据源之间,用于临时存放 ... -
JPA注解学习总结
2010-10-26 21:02 4255核心提示:JPA 注解的几个要点 1.设置Pojo为实体 ... -
EHCache 缓存全接触
2010-10-26 21:01 2011EHCache 是一个纯java的,在Hibernate2.1 ... -
Hibernate cascade和inverse实例分析
2010-10-26 20:59 1462首先引用另一个blog的说 ... -
Hibernate的拦截器和监听器
2010-10-26 20:57 1456最近项目需要,用到了Hibernate的拦截器和监听器,有些小 ... -
Hibernate Shards 数据的水平、垂直切割 Hibernate测试环境
2010-10-24 11:15 1209http://www.cnblogs.com/RicCC/ar ... -
Java 开发 2.0: 使用 Hibernate Shards 进行切分
2010-10-24 11:10 1457当关系数据库试图在一 ... -
Hibernate Shards - 关系数据库水平分割解决方案框架
2010-10-24 10:41 33191。水平分割:按记录进分分割,不同的记录可以分开保存,每个子表 ... -
hibernate 调用存储过程
2010-02-07 14:05 7317第 17 章 Native SQL查询 你也可以使用 ...
相关推荐
NULL 博文链接:https://sxpujs.iteye.com/blog/368960
很多人都对Java在批量数据的处理方面是否是其合适的场所持有怀疑的念头,由此延伸,...下面以Hibernate为例来做为说明,假如我们真的不得不在Java中使用Hibernate来对数据进行批量处理的话。 向数据库插入100 000条数据
解决getHibernateTemplate().save ()不能将数据保存到数据库的问题JusterDu 2016-03-15 08:38:57 1857
在此不讨论两种方案的优劣,我只是写了个hibernate的例子来实现第一种策略.例子很简单,t_user表主要两个字段,name和photo,其中photo字段类型为Blob.在此例中数据库我采用mysql,oracle的Blob字段比较特殊,你...
Hibernate 使用缓存时,数据同步问题
2、 struts+hibernate保存图片 struts+hibernate整合项目保存图片时候,除了struts的FormFile起主要作用外,hibernate做了什么?其实hibernate所做的事和保存图片没太大的关系,只是把路径保存了 3、 struts保存...
hibernate的各种保存方式的区别
hibernate保存、修改方面优势明显,Mybatis查询方面更加优秀灵活。 只需要写Service、action等其他层的代码,视图层采用了freemarker技术,也可以使用jsp或其他,看自己喜好。 配置文件在更目录下的config目录下,有...
有关hibernate中保存多对一关联关系的进一步分析,很详细的介绍了多对一关系
Hibernate对象状态以及各种保存方法的区别
hibernate many-to-many级联保存,级联更新,级联删除
2.jsp页面如何提交到后台Action,如何把Action中的数据通过Hibernate保存到后台数据库,以及把数据库中数据展现到jsp中的全部源码. 另外: struts2,hibernate,spring三个框架的jar包,请在csdn中下载ssh2_lib.rar文件,...
hibernate面向对象树型结果开放实例
jsp hibernate 数据保存操作的原理.docx
C#Hibernate mssqlserver数据库海量读写快速存储
第1课 课程内容 6 第2课 Hibernate UML图 6 第3课 风格 7 ...5、TABLE - 使用表保存id值 23 三、 联合主键 24 1、xml方式 24 2、annotation方式 27 第14课 Hibernate核心开发接口(重点) 29 ........
一.持久化:将内存中的瞬时态数据保存成数据库中持久态数据的操作 1.瞬时态:以new命令实例化后从未用session将其与数据库关联(保存)过的... 2.Hibernate映射文件:Hibernate映射文件是Hibernate与数据库进行持久化的桥梁