`
dengwanchuan
  • 浏览: 45292 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

Hibernate的merge与update方法的区别

阅读更多

 

今天做了个测试,写了个测试用例来看看merge与update时控制台打印出来的日志有什么不一样。实体bean很简单,就id和name两个字段,接下来分别给出以下几种测试情形的控制台日志内容:


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 merge、update与saveOrUpdate方法的区别

    Hibernate merge、update与saveOrUpdate方法的区别

    session中merge和update的区别

    Hibernate中session的merge以及update方法

    Hibernate中的merge使用详情解说.docx

    当ID在数据库中能找到的时候,update与merge的执行效果都是更新数据,发出update语句; 如果没有设置ID的话,则这个对象就当作瞬态处理: 用update的话,由于没有ID,所以会报异常,merge此时则会保存数据,根据ID...

    save, saveOrUpdate, persist, merge, update 区别.docx

    hibernate save()方法能够保存实体到数据库,正如方法名称save这个单词所表明的意思。我们能够在事务之外调用这个方法,这也是我不喜欢使用这个方法保存数据的原因。 假如两个实体之间有关系(例如employee表和...

    Hibernate的Session的javadoc

    我身边的朋友经常会分不清save、saveOrUpdate、update的区别,lock、merge、replicate、refresh、evict甚至不知道是干什么用的。而且关于实体对象的生命周期也有很多概念不清,分不清transient、persistent、...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...

    Hibernate注解

    * 9.increnment 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。 * 例:@GeneratedValue(generator = ...

    Hibernate注释大全收藏

    Hibernate 可以对类的属性或者方法进行注解。属性对应field类别,方法的 getXxx()对应property类别。 定义表 通过 @Table 为实体Bean指定对应数据库表,目录和schema的名字。 @Entity @Table(name="tbl_sky") ...

    精通Hibernate:对象持久化技术第二版part3

    本章主要介绍单个持久化类与单个数据库表之间进行映射的方法,尤其是当持久化类的属性不和数据库表的字段一一对应时的映射技巧。 5.1 持久化类的属性及访问方法 101 5.1.1 基本类型属性和包装类型属性 102 5.1.2 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     8.4.5 Session的merge()方法  8.4.6 Session的delete()方法  8.4.7 Session的replicate()方法  8.5 级联操纵对象图  8.5.1 级联保存临时对象  8.5.2 更新持久化对象  8.5.3 持久化临时对象  8.5.4 更新游离...

    Hibernate_Annotation关联映射

    Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键...

    低清版 大型门户网站是这样炼成的.pdf

    5.1.10 使用hibernate的isinitialized()与initialize()方法 277 5.1.11 持久化对象间的级联操作 277 5.2 hibernate的检索策略 291 5.2.1 立即检索 291 5.2.2 延迟检索 296 5.2.3 迫切左外连接检索 300 5.3 hql...

    Java通用代码生成实用程序XDoclet(源码包)

    XDoclet 是一个通用的代码生成实用程序,是一个扩展的Javadoc Doclet引擎,它允许您使用象 JavaDoc 标记之 类的东西来向诸如类、方法和字段之类的语言特征添加元数据。随后,它利用这些额外的元数据来生成诸如部署...

    java语言hebernate代码

    在我们程序当中调用save,update,get,load,saveOrUpdate,merge,list c:游离状态(脱管状态) 对象从session作用域分离出来的时候我们叫做游离(脱管) 即:调用delete,clear,evict等方法时

    支持多数据库的ORM框架ef-orm.zip

    事实上针对单个对象的get/load/persist/save/update/merge/saveOrUpdate API和Criteria API本来就为一体,只不过是历史的原因被人为割裂成为两套数据库操作API罢了。  因此,对于关系型数据库而言——Entity和...

Global site tag (gtag.js) - Google Analytics