当前位置:首页 > 开发 > 数据库 > 正文

merge与update区别---->你一定要看! (转帖)

发表于: 2014-11-25   作者:BreakingBad   来源:转载   浏览次数:
摘要: merge与update区别 注:就因为这2个方法的区别还得我花了太多时间项目迟迟不能做完 ,但是让我解决了,学到了东西了. 这是一段代码 public void updateData(Object obj) { try { tx = this.getSession().beginTransaction(); // 执行修改操作 //this.getSession().updat

merge与update区别

注:就因为这2个方法的区别还得我花了太多时间项目迟迟不能做完

,但是让我解决了,学到了东西了.

这是一段代码

public void updateData(Object obj) {
try {
tx = this.getSession().beginTransaction();
// 执行修改操作

//this.getSession().update(obj);
this.getSession().merge(obj);
tx.commit();
} catch (Exception e) {
System.out.println("===修改信息出现异常===");
e.printStackTrace();
tx.rollback();
}
}

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还是托管状态。

 

merge与update区别---->你一定要看! (转帖)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
俗语有云:花钱容易,挣钱难,且用且珍惜。能存的了钱的人,无非两种:1、拼死拼活赚的多;2、精打
hibernate的保存 hibernate对于对象的保存提供了太多的方法,他们之间有很多不同,这里细说一下,以
? ?温总理,你没有个总理样,??? 从未看见象你这么大的官还要亲临险地指挥救死扶伤;??? 温总理,你
为了让更多的人能够从本质上理解编译器和解释器的区别,我杜撰了一个小故事 来福与旺财的养牛场 来
http://gitbook.liuhui998.com/4_2.html rebase 假设你现在基于远程分支"origin",创建一个叫"mywor
一.for update 和 for update nowait 的区别 首先一点,如果只是select 的话,Oracle是不会加任何锁
一.for update 和 for update nowait 的区别 首先一点,如果只是select 的话,Oracle是不会加任何锁
引用 update 更新表中多条记录。从另一个表中调用记录。 实例效果图: 我的应用: 创建主表: CREATE
本文转自:http://www.cnblogs.com/gudujianxiao/archive/2012/07/17/2594709.html SSIS Data Flow
有人工作,有人上学,大家千万不要错过这篇文章,能看到这篇文章也是一种幸运,真的受益匪浅,对我
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号