`
fly.net.cn
  • 浏览: 186850 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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()它。</timestamp></version>

  否则update() 这个对象.

        三,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的,这个详细见这里

  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

分享到:
评论

相关推荐

    hibernate的各种保存方式的区别

    ### Hibernate的各种保存方式的区别 #### 一、预备知识 在深入了解Hibernate中各种保存方式之前,我们需要先了解对象在Hibernate中的几种状态。对于Hibernate而言,对象的状态主要包括以下三种: 1. **瞬态...

    hibernate调用存储过程

    hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程

    Hibernate存储Clob字段的方式总结

    Hibernate存储Clob字段的方式总结涉及了在Java开发中使用Hibernate操作大型文本字段Clob的操作方法。本文主要介绍了两种操作Clob字段的方法,一种是将Clob字段直接映射为String类型,另一种是使用Clob类型进行处理。...

    Hibernate主键生成方式

    当Hibernate保存一个新实体时,数据库会自动为该实体分配一个新的唯一值。这种方式适用于那些支持自动增长字段的数据库,如MySQL和SQL Server。 2. **Increment方式**:`&lt;generator class="increment"/&gt;` 这种方式...

    Hibernate对象状态以及各种保存方法的区别

    **保存方法的区别:** - **save()**: 用于将瞬时对象持久化,如果对象已经具有数据库ID(即之前是持久化的对象),则可能会导致重复的记录。 - **update()**: 更新数据库中已存在的记录,适用于已知对象是持久的,但...

    Hibernate使用存储过程

    在IT领域,尤其是在Java开发中,Hibernate是一个非常流行的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式操作数据库。尽管ORM的核心是将Java对象映射到数据库表,但有时我们还需要直接利用数据库提供的...

    Hibernate的各种保存方式的区别详解

    Hibernate保存方式的区别详解 Hibernate提供了多种保存方式,包括save()、persist()、update()、saveOrUpdate()等,了解这些方法的区别非常重要,以便正确使用它们。本文将对Hibernate的各种保存方式进行详细的比较...

    spring hibernate执行存储过程的例子

    Spring和Hibernate是Java开发中常用的两个框架,它们提供了对存储过程的支持。本文将深入探讨如何在Spring和Hibernate中执行存储过程,并基于描述中的例子进行解析。 首先,让我们了解Spring如何执行存储过程。...

    hibernate调用存储过程的方法调用

    Hibernate作为Java领域内广泛使用的对象关系映射(ORM)框架,提供了调用数据库存储过程的能力。本文将深入探讨如何使用Hibernate调用存储过程,并结合提供的资源文件——`proc.sql`、`hibernateProc.sql`和`...

    hibernate框架调用存储过程

    本篇文章将深入探讨如何在Hibernate框架中调用存储过程,并与JDBC调用存储过程的方式进行比较。 首先,我们要了解存储过程是什么。存储过程是预编译的SQL语句集合,存储在数据库服务器中,可被多次调用,减少了网络...

    hibernate存储过程

    在IT领域,Hibernate是一个非常流行的Java对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而"hibernate存储过程"是指使用Hibernate来调用数据库中的存储过程。存储过程...

    hibernate调用存储过程具体方法

    hibernate本对数据库的操作有些不完美,有必要的时候可以调用存储过程来补足。

    Hibernate下数据批量处理解决方案

    在Java开发中,尤其是涉及到大数据量的处理时,人们往往会质疑ORM框架,如Hibernate,是否适合进行批量数据操作。然而,实际上,通过适当的技术手段,我们可以有效地解决Hibernate在批量处理时可能出现的性能问题。...

    hibernate保存图片

    ### Hibernate保存图片知识点详解 #### 一、引言 在Web开发中,处理用户上传的图片是一项常见的需求。本文档将详细介绍如何利用Hibernate框架将图片数据直接存储到数据库的Blob字段中。通过这种方式,可以避免在...

    Hibernate Hibernate5 讲义 PDF

    Hibernate是一个开源的对象关系映射(ORM)框架,它封装了JDBC(Java Database Connectivity)的复杂性,并允许Java开发者以面向对象的方式操作数据库。Hibernate框架被广泛应用于企业级Java应用程序中,可以与...

    kingbaseV8 hibernate jdbc 驱动

    例如,`hibernate-core-5.0.12.Final.jar`是Hibernate 5.0系列的一个稳定版本,包含了对JPA 2.1的支持以及各种性能优化。而较早的版本如`hibernate3.jar`和`hibernate-3.1.jar`则对应Hibernate 3.x系列,其功能可能...

    hibernate3 hibernate3

    2. 表映射(Mapping):Hibernate使用XML或注解方式将实体类映射到数据库表。例如,使用@Table注解指定对应的表名,@Column注解定义列属性。 3. 主键(Primary Key):每个实体都应有一个唯一的标识符,通常由@Id...

Global site tag (gtag.js) - Google Analytics