`

Hibernate理论

阅读更多

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

分享到:
评论

相关推荐

    Hibernate理论基础

    **Hibernate理论基础** Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中使用面向对象的方式操作数据库。ORM框架的核心思想是将数据库中的表与Java类进行映射,使得开发者可以避免...

    struts2 spring hibernate框架技术与项目实战 光盘源码

    详细讲解了S2SH框架技术的基本知识和使用方法,从Eclipse开发平台、JSP、Servlet等基础知识讲起,由浅入深,重点介绍了当前流行的三个轻量级开源框架:Struts2、Spring和Hibemate.

    hibernate-distribution-3.6.6.Final.tar.gz

    6. **文档**:可能还包括PDF或HTML格式的官方用户指南、参考手册等,这些都是深入学习Hibernate理论知识的重要资料。 了解了压缩包的基本结构后,我们来探讨一下Hibernate的核心功能: - **对象关系映射(ORM)**...

    hibernate文档

    JAVA Hibernate理论讲解,主要对hibernate这门技术进行分节介绍

    hibernate实战 英文版

    2. **实用性**:本书不仅仅局限于理论介绍,更注重实践应用,通过大量示例帮助读者掌握Hibernate的实际操作技巧。 3. **全面性**:从基础概念到高级技术,本书内容全面覆盖了Hibernate的各个方面,适合不同层次的...

    Hibernate官方中文参考手册+Hibernate开发指南+Hibernate的两本英文书籍

    《Hibernate开发指南》则是一本实践性很强的书籍,它不仅包含了理论知识,还提供了大量的示例代码,帮助读者将所学应用到实际项目中。该书会详细讲解如何在实际开发环境中设置和使用Hibernate,如整合Spring框架、...

    hibernate基础技术

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行解耦,简化了数据库应用程序的开发。本教程将深入介绍Hibernate的基础技术,旨在为初学者提供全面的理解和实践指导。 ...

    hibernate中文参考文档

    Hibernate是一款开源的对象关系映射(Object/Relational Mapping,...整个文档是一个综合性的Hibernate使用指南,它从理论到实践都有所涵盖,对于任何想要深入学习和使用Hibernate框架的Java开发者来说都是宝贵的资源。

    精通hibernate3.0(第三版).rar

    10. 经典实例:书中提供的实战案例可以帮助读者将理论知识应用到实际项目中,加深理解和记忆。 通过阅读《精通Hibernate 3.0(第三版)》,Java开发者可以系统地学习和掌握Hibernate的各个方面,提高开发效率,减少...

    hibernate-tutorials_java_hibernate_Eclipse_fallenweg_

    通过这些案例,读者将能够将理论知识应用于实践中,巩固学习成果。 总的来说,"hibernate-tutorials_java_hibernate_Eclipse_fallenweg_"这个资源包提供了一个全面的学习路径,涵盖了从安装配置到实际开发的所有...

    Hibernate 经典例子全

    **标题:Hibernate经典例子全** **内容:** Hibernate是一款强大的Java持久化框架,它简化了...对于初学者来说,这些例子提供了宝贵的实践机会,而对于有经验的开发者,它们可以帮助巩固理论知识并探索更高级的用法。

    Hibernate反向工程

    【Hibernate反向工程】是...在学习过程中,不仅要理解理论知识,还要动手实践,将所学应用于实际项目,这样才能真正实现从菜鸟到高手的蜕变。分享这些知识,可以帮助更多的人快速掌握Hibernate反向工程,提高开发效率。

    精通Hibernate(孙卫琴)

    最后,书中的实战案例部分,通过实际项目的开发过程,帮助读者将理论知识应用到实践中,增强了解决问题的能力。这些案例涵盖了常见的业务场景,如用户管理、订单处理等,使读者能够在实践中巩固所学知识。 总之,...

    韩顺平hibernate

    综上所述,"韩顺平hibernate"的学习资源覆盖了Hibernate的各个方面,从基础到进阶,从理论到实践,对提升开发者在Java Web开发中的数据库操作能力具有极大帮助。通过深入学习这些内容,不仅可以掌握Hibernate的使用...

    Hibernate In Action(Java.Persistence.with.Hibernate)源码

    《Hibernate In Action(Java.Persistence.with.Hibernate)》是一本深入探讨Hibernate框架的书籍,源码则是作者为了配合书中理论部分而提供的实践示例。Hibernate是一个流行的开源对象关系映射(ORM)框架,它允许...

    Hibernate4.1.11中文手册

    最后,可能会包含一些实战案例,帮助读者将理论知识应用到实际项目中。 总之,《Hibernate4.1.11中文手册》是Java开发者深入理解和掌握Hibernate框架不可或缺的参考资料,它全面覆盖了从基本概念到高级特性的各个...

    hibernate电子书

    在实际项目中,开发者需要结合《Hibernate Develop Guide》的理论知识与实践,通过下载地址获取的电子书,结合自己的编程环境进行实战演练,才能真正掌握Hibernate的精髓。这本书对于Java后端开发者,尤其是那些致力...

    hibernate框架基础教程适合新手

    Hibernate是一个强大的Java持久化框架,它为开发人员提供了一种简单、高效的方式来处理数据库操作。这个基础教程针对新手,旨在让初学者从零...记住,理论学习与实际操作相结合,才能更好地理解和掌握这个强大的框架。

Global site tag (gtag.js) - Google Analytics