- 浏览: 223795 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
kandari:
很全,收藏
oracle相关知识 -
若见三生石:
,辛苦楼主!感谢为大伙敏捷开发做出贡献!
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
若见三生石:
你好,要定义的类和类型怎么写呢?
Oracle中的二进制、八进制、十进制、十六进制相互转换函数 -
greatwqs:
...
PLSQL操作文件 -
sun17921:
var areaCode ={11:"北京" ...
身份证验证JS
hibernate对JPA支持:http://hi.baidu.com/shirdrn/blog/item/241baff561291820bd31096b.html
(主要讲解带注释的bean)
Hibernate提供了两级缓存,第一级是Session的缓存 。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法比卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。
第二级缓存是一个可插拔的的缓存插件,它是由SessionFactory负责管理 。由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此第二级缓存是进程范围或者集群范围的缓存。这个缓存中存放的对象的松散数据。第二级对象有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。缓存适配器用于把具体的缓存实现软件与Hibernate集成。第二级缓存是可选的,可以在每个类或每个集合的粒度上配置第二级缓存。
Hibernate对象:
1、瞬时对象(Transient Objects):
使用new操作符初始化的对象不是立刻持久的。的状态是瞬时的,也就说没有和任何数据库表进行关联。只要应用不再引用这对象,他的状态将丢失,并且由垃圾回收机制回收。数据库中没有此对象,只是存在内存中。
2、持久对象(Persist Objects): 持久对象是具有数据库标识的,也就是从数据库获取来的。他有持久化管理器Session统一管理,持久实例实在事务中进行操作--当事务结束他的状态与数据库同步,可以这样理解当我们在对象处于Persist 状态时候我们对对象的改变将会同步道数据库中,其原理是当事务提交时刻,提供执行SQL的i(DML)nsert 、update、delete语句把内存中的状态同步到数据库中。
3、离线对象(Detached Objects): Session关闭之后,持久化对象变成离线对象,离线对象就不能同数据库同步,也不再受Hibernate管理。此时数据库中还存在这个对象,只是没有纳入Session管理。
结论:
1. merge()方法会导致执行查询group对象的select语句,在调用merge()命令时立即执行(条件:目标group对象没有被缓存)
2. 无论merger()或save()方法,insert语句都在最后执行,并非在调用相应命令时立即执行
3. 直接调用merge()方法时,会返回一个新的instance,原po保持不变
4. save()之后,po中的group对象并没有被关联到session,因此查询group(id=1)会触发select语句
5. save()之后,po对象被关联到session,再次查询,不会触发select语句,并且不会检查group对象是否被关联到session
6. save()之后再调用merge,返回的是同一个instance,但其关联group对象会被更新
如果在add一个对象之后,如果存在关联对象,并且需要再同一个hibernate session中进行回显,则建议使用merge()方法。
1. 数据库记录已存在,更改person的name为一个新的name。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: update person set name=? where id=?
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
2. 数据库记录已存在,更改person的name和数据库里对应id记录的name一样的值。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
此处相对于第一种情形少了update的动作
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
3. 数据库记录不存在时,也就是你传的实体bean的ID在数据库没有对应的记录。
merge方法打印出的日志如下:
Hibernate: select person0_.id as id0_0_, person0_.name as name0_0_ from person person0_ where person0_.id=?
Hibernate: insert into person (name) values (?)
如果没有对应的记录,merge会把该记录当作新的记录来插入。此处我很疑惑,因为我传得person实体对象里写明了id值的,它为什么还会做插入的动作呢?
update方法打印出的日志如下:
Hibernate: update person set name=? where id=?
2009-11-22 20:59:55,359 ERROR [org.hibernate.jdbc.AbstractBatcher] - Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
以下的内容摘抄自网上:
当我们使用update的时候,执行完成后,我们提供的对象A的状态变成持久化状态。
但当我们使用merge的时候,执行完成,我们提供的对象A还是脱管状态,hibernate或者new了一个B,或者检索到 一个持久对象B,并把我们提供的对象A的所有的值拷贝到这个B,执行完成后B是持久状态,而我们提供的A还是托管状态。
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还是托管状态。
六、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
发表评论
-
Spring 框架的设计理念与设计模式分析
2011-07-20 16:23 857http://www.ibm.com/developerwor ... -
struts1.2和2.0
2011-07-14 13:33 861WebWork 2 : 与Struts的比较 Th ... -
Struts1和Struts2的区别
2009-12-30 16:13 779Action 类: ◆Struts1要求Action类继承 ... -
WebWork概述
2009-12-30 16:12 791WebWork是建立在称为XWork的Command模式框架之 ... -
IBATIS缓存
2009-12-23 17:56 814iBATIS可以在Mapped Statement ... -
IOC实现原理
2009-12-16 21:03 1583对Spring IOC的理解离不开 ... -
spring的AOP理论
2009-12-16 13:01 864AOP术语:http://kang.iteye.com/blo ... -
Hibernate悲观锁和乐观锁
2009-12-16 12:57 916锁 ( locking ) 业务逻辑的实现过程中,往 ... -
webService理论和XFire
2009-12-14 15:42 874http://in3040.blog.163.com/blog ... -
EJB理论3.0
2009-12-11 15:08 782在已经提交的EJB3.0规范 ... -
WebService实现包--AXIS2
2009-12-11 14:48 1546深度探索 Axis2:AXIOM: http://ww ... -
EJB理论
2009-12-11 14:36 8351、EJB与JAVA BEAN的区别 ... -
RMI理论
2009-12-11 11:06 794一、RMI系统运行机理 RMI应用程序通常包括两个 ... -
RMI应用的实现例子1和spring实现的RMI例子2
2009-12-11 10:11 3587一个正常工作的RMI系统由下面几个部分组成: ● 远 ... -
spring2.5中的@注释配置
2009-12-10 20:01 975下面这篇文章写得很更清晰 http://haowei0315 ... -
AOP总结(spring)
2009-12-10 14:32 958实现AOP流程: Service s = new Servi ... -
AOP的JDK and CGLib 动态代理 示例
2009-12-09 16:50 1011package com.proxy; public ... -
AOP例子(spring配置实现)
2009-12-07 13:13 1741此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没 ... -
AOP理论
2009-12-07 11:45 809原文地址:http://dev.csdn. ... -
AOP生成代码三种方式
2009-06-05 09:44 1100AOP生成代码有三种可能方式: (1)静态编译时期,源代码生 ...
相关推荐
**Hibernate理论基础** Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中使用面向对象的方式操作数据库。ORM框架的核心思想是将数据库中的表与Java类进行映射,使得开发者可以避免...
详细讲解了S2SH框架技术的基本知识和使用方法,从Eclipse开发平台、JSP、Servlet等基础知识讲起,由浅入深,重点介绍了当前流行的三个轻量级开源框架:Struts2、Spring和Hibemate.
6. **文档**:可能还包括PDF或HTML格式的官方用户指南、参考手册等,这些都是深入学习Hibernate理论知识的重要资料。 了解了压缩包的基本结构后,我们来探讨一下Hibernate的核心功能: - **对象关系映射(ORM)**...
JAVA Hibernate理论讲解,主要对hibernate这门技术进行分节介绍
2. **实用性**:本书不仅仅局限于理论介绍,更注重实践应用,通过大量示例帮助读者掌握Hibernate的实际操作技巧。 3. **全面性**:从基础概念到高级技术,本书内容全面覆盖了Hibernate的各个方面,适合不同层次的...
《Hibernate开发指南》则是一本实践性很强的书籍,它不仅包含了理论知识,还提供了大量的示例代码,帮助读者将所学应用到实际项目中。该书会详细讲解如何在实际开发环境中设置和使用Hibernate,如整合Spring框架、...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行解耦,简化了数据库应用程序的开发。本教程将深入介绍Hibernate的基础技术,旨在为初学者提供全面的理解和实践指导。 ...
Hibernate是一款开源的对象关系映射(Object/Relational Mapping,...整个文档是一个综合性的Hibernate使用指南,它从理论到实践都有所涵盖,对于任何想要深入学习和使用Hibernate框架的Java开发者来说都是宝贵的资源。
10. 经典实例:书中提供的实战案例可以帮助读者将理论知识应用到实际项目中,加深理解和记忆。 通过阅读《精通Hibernate 3.0(第三版)》,Java开发者可以系统地学习和掌握Hibernate的各个方面,提高开发效率,减少...
通过这些案例,读者将能够将理论知识应用于实践中,巩固学习成果。 总的来说,"hibernate-tutorials_java_hibernate_Eclipse_fallenweg_"这个资源包提供了一个全面的学习路径,涵盖了从安装配置到实际开发的所有...
**标题:Hibernate经典例子全** **内容:** Hibernate是一款强大的Java持久化框架,它简化了...对于初学者来说,这些例子提供了宝贵的实践机会,而对于有经验的开发者,它们可以帮助巩固理论知识并探索更高级的用法。
【Hibernate反向工程】是...在学习过程中,不仅要理解理论知识,还要动手实践,将所学应用于实际项目,这样才能真正实现从菜鸟到高手的蜕变。分享这些知识,可以帮助更多的人快速掌握Hibernate反向工程,提高开发效率。
最后,书中的实战案例部分,通过实际项目的开发过程,帮助读者将理论知识应用到实践中,增强了解决问题的能力。这些案例涵盖了常见的业务场景,如用户管理、订单处理等,使读者能够在实践中巩固所学知识。 总之,...
综上所述,"韩顺平hibernate"的学习资源覆盖了Hibernate的各个方面,从基础到进阶,从理论到实践,对提升开发者在Java Web开发中的数据库操作能力具有极大帮助。通过深入学习这些内容,不仅可以掌握Hibernate的使用...
《Hibernate In Action(Java.Persistence.with.Hibernate)》是一本深入探讨Hibernate框架的书籍,源码则是作者为了配合书中理论部分而提供的实践示例。Hibernate是一个流行的开源对象关系映射(ORM)框架,它允许...
最后,可能会包含一些实战案例,帮助读者将理论知识应用到实际项目中。 总之,《Hibernate4.1.11中文手册》是Java开发者深入理解和掌握Hibernate框架不可或缺的参考资料,它全面覆盖了从基本概念到高级特性的各个...
在实际项目中,开发者需要结合《Hibernate Develop Guide》的理论知识与实践,通过下载地址获取的电子书,结合自己的编程环境进行实战演练,才能真正掌握Hibernate的精髓。这本书对于Java后端开发者,尤其是那些致力...
Hibernate是一个强大的Java持久化框架,它为开发人员提供了一种简单、高效的方式来处理数据库操作。这个基础教程针对新手,旨在让初学者从零...记住,理论学习与实际操作相结合,才能更好地理解和掌握这个强大的框架。