- 浏览: 1332563 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (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 33771.EhCache是什么 EhCache是Hiberna ... -
全面讲解Hibernate二级缓存
2010-12-02 21:37 1171向大家详细介绍Hibernate ... -
深入理解Hibernate日志
2010-12-02 21:33 1911Hibernate中使用什么来记录日志呢?通常Hibern ... -
Hibernate中悲观锁和乐观锁
2010-12-02 21:19 3266Hibernate悲观锁:在数 ... -
解读Hibernate继承映射策略
2010-12-02 20:33 1093Hibernate继承映射的英文是Inheritanc ... -
mysql的text如何dialect mapping
2010-11-17 12:35 2314在开发项目中,遇到了hibernate 的2个bug。导致 ... -
让hibernate支持date_add
2010-11-17 12:30 5201今天做东西的时候想 ... -
Hibernate3一级缓存和二级缓存的理解!
2010-11-04 20:06 16991. Session 级别的缓存,它同 ... -
Hibernate的缓存机制
2010-10-26 21:24 1279核心提示:缓存是位于应用程序与物理数据源之间,用于临时存放 ... -
JPA注解学习总结
2010-10-26 21:02 4281核心提示:JPA 注解的几个要点 1.设置Pojo为实体 ... -
EHCache 缓存全接触
2010-10-26 21:01 2040EHCache 是一个纯java的,在Hibernate2.1 ... -
Hibernate cascade和inverse实例分析
2010-10-26 20:59 1490首先引用另一个blog的说 ... -
Hibernate的拦截器和监听器
2010-10-26 20:57 1491最近项目需要,用到了Hibernate的拦截器和监听器,有些小 ... -
Hibernate Shards 数据的水平、垂直切割 Hibernate测试环境
2010-10-24 11:15 1233http://www.cnblogs.com/RicCC/ar ... -
Java 开发 2.0: 使用 Hibernate Shards 进行切分
2010-10-24 11:10 1488当关系数据库试图在一 ... -
Hibernate Shards - 关系数据库水平分割解决方案框架
2010-10-24 10:41 33601。水平分割:按记录进分分割,不同的记录可以分开保存,每个子表 ... -
hibernate 调用存储过程
2010-02-07 14:05 7350第 17 章 Native SQL查询 你也可以使用 ...
相关推荐
标题中的"hibernate保存不到数据1"是一个关于Hibernate框架在尝试保存数据到数据库时遇到问题的场景。描述提到了一个具体的解决方案,即通过在`hibernate.cfg.xml`配置文件中设置`connection.autocommit`属性为`true...
这篇文章将详细讲解如何在Hibernate中保存这两种特殊类型的数据。 BLOB用于存储二进制大对象,如图片、音频或视频文件等;而CLOB则用于存储字符型的大数据,例如长文本、XML文档等。在Java中,Blob和Clob是JDBC API...
### Hibernate保存图片知识点详解 #### 一、引言 在Web开发中,处理用户上传的图片是一项常见的需求。本文档将详细介绍如何利用Hibernate框架将图片数据直接存储到数据库的Blob字段中。通过这种方式,可以避免在...
在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...
4. **持久化类(Persistent Class)**:持久化类是具有持久性状态的实体类,它们的状态可以通过Hibernate保存到数据库中。Hibernate使用注解或XML配置文件来定义字段与数据库列的映射。 5. **ID生成策略**:每个...
项目中的源码将展示如何使用Hibernate保存、更新、查询和删除数据。这包括了如何添加新的关联对象,如何更新已存在的关联,以及如何查询和删除数据。 通过详细研究**hibernate_second**项目,开发者不仅可以掌握...
当Hibernate保存一个新实体时,数据库会自动为该实体分配一个新的唯一值。这种方式适用于那些支持自动增长字段的数据库,如MySQL和SQL Server。 2. **Increment方式**:`<generator class="increment"/>` 这种方式...
这个简单的例子展示了如何使用Hibernate保存一个新用户到数据库。进一步学习时,你可以尝试查询、更新和删除操作,以及更复杂的查询表达式。 **总结** 通过这个"Hibernate的第一个例子",我们了解了如何配置...
当一个实体被加载到Session时,其状态会保存在一级缓存中,以便后续操作能够快速访问,无需再次查询数据库。一级缓存在Session关闭或清空时失效。 - **二级缓存**:在SessionFactory级别共享,用于跨Session存储...
在大多数情况下,修改对象的状态只需在程序中直接操作,然后通过Hibernate保存更改。 Hibernate的API学习曲线平缓,它无缝融入程序流程,使得数据库操作更加自然。此外,Hibernate的数据库无关性也是一个显著优点,...
8. **集成测试**:完成上述配置后,开发者通常会编写一些测试用例来验证Struts2和Hibernate的整合是否正确,比如创建一个新的实体对象,通过Hibernate保存到数据库,然后通过Struts2的Action查询并展示出来。...
在`hibernate_0001_helloWorld`这个子目录中,可能包含了一个简单的HelloWorld示例,展示了如何使用Hibernate保存和查询数据。这个示例通常包括一个简单的实体类、一个对应的数据库表、以及一些基本的保存和查询操作...
`uploadImg`方法会解析`HttpServletRequest`,找到上传的文件,然后将文件内容读取到内存或磁盘,最后通过Hibernate保存到Oracle数据库中。具体实现通常会涉及到解析文件项,获取文件内容,创建`Learner`对象并调用...
这个测试类会创建一个新的`Guestbook`对象,并通过Hibernate保存到数据库中。运行这个测试,如果一切配置正确,数据将被成功插入到`guestbook`表中。 通过以上步骤,利用MyEclipse的自动生成功能,我们可以快速地...
4. **数据库管理**:通过Hibernate保存和查询用户信息、聊天记录等数据。 5. **网络通信**:使用Socket编程或者HTTP协议实现客户端与服务器之间的实时通信。 在文件"qq1.0"中,可能包含了项目的源代码、配置文件、...
1. **新闻添加**:用户或管理员可以通过表单提交新闻标题、内容、类别等信息,这些信息通过Struts Action被传递到后台服务,然后由Hibernate保存到数据库。 2. **新闻删除**:系统提供接口供用户或管理员选择并删除...
4. **持久化类和标识符**:持久化类是具有持久状态的Java类,其实例可以通过Hibernate保存到数据库。每个持久化类都需要一个唯一的标识符(ID),这通常由`@Id`注解标记的属性表示。 5. **关联映射**:Hibernate...
- **注册**:用户填写基本信息并提交,Struts框架接收请求,调用对应的Action,验证数据,通过Hibernate保存到数据库。 - **登录**:用户输入账号和密码,后台验证后,如果成功,将用户信息存储在session中,以便...