`

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

阅读更多

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

 

分享到:
评论

相关推荐

    Include和merge标签使用

    -- 其他页面内容 --> </LinearLayout> ``` 这样,我们就将header.xml中的内容嵌入到了主页面中。这种方式不仅简化了代码,还使得对头部布局的修改能立即反映到所有包含它的页面上。 接下来,我们来看`<merge>`标签...

    WinMerge-2.16.31-x64-Setup安装包

    WinMerge-2.16.31-x64-Setup安装包

    Merge2012.4162-x64破解补丁版.rar

    Merge2012.4162-x64.msi正常安装后替换EXE文件,可直接正常使用。

    Hibernate merge、update与saveOrUpdate方法的区别

    ### Hibernate merge、update与saveOrUpdate方法的区别 在Hibernate框架中,`merge`、`update`与`saveOrUpdate`这三个方法都是用于更新或保存实体对象到数据库中的,但它们之间存在着重要的区别,这些区别主要体现...

    WinMerge-2.16.0-x64-Setup.exe

    WinMerge是一款运行于Windows系统下的免费开源的文件比较/合并工具,使用它可以非常方便地比较多个文档内容甚至是文件夹与文件夹之间的文件差异。适合程序员或者经常需要撰写文稿的朋友使用。

    WinMerge-2.16.8-x64-Setup.exe

    WinMerge-2.16.8-x64-Setup.exe

    android layout merge

    本篇文章将深入探讨`merge`布局的使用,以及它如何与Genymotion模拟器关联。 `merge`布局在Android中主要用于减少视图层次,提高布局渲染效率。在没有使用`merge`的情况下,我们通常会在一个父布局(如`...

    WinMerge-2.12.4-Setup

    7. **集成其他工具**:WinMerge支持与其他应用程序集成,例如与版本控制系统(如Git、SVN)的整合,可以通过外部命令调用WinMerge来查看和解决冲突。 8. **版本历史查看**:如果你使用的是支持版本历史的文件系统...

    springmvcmybatis

    -- (事务管理)transaction manager, use JtaTransactionManager for global tx --> class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ...

    Android中include和merge标签的使用

    -- merge_layout.xml --> <merge> <include layout="@layout/button_layout" /> <include layout="@layout/text_view_layout" /> </merge> ``` 这样,`parent_layout.xml`包含了`merge_layout.xml`,而`merge_...

    Merge2020.5406-x64.msi

    Araxis Merge 能比较和使用不同的文本文件版本,比如程序源代码,XML 和 HTML 文件。支持带有 ASCII, MBCS 和 Unicode 字符编码。利用带颜色的 side-by-side comparison 很容易比较出类似或不同的文档,并在两文件...

    Merge2012.4198-x64 含破解文件 part1。

    Merge 2012.4198 64位系统下的对比工具,win7 64位亲测。

    WinMerge-64bit-2.16.38

    《WinMerge-64bit-2.16.38:深入解析与应用》 WinMerge是一款高效且功能强大的文件对比和合并工具,尤其在软件开发、文本编辑以及版本控制等场景中,它扮演着至关重要的角色。标题中的"WinMerge-64bit-2.16.38"指的...

    Merge2012.4260-Win32 安装程序

    "Merge2012.4260-Win32 安装程序"是一个专为Windows 32位操作系统设计的软件安装包。这个标题暗示我们,它属于Merge系列的一个特定版本,即2012年发布的4260版。在IT行业中,安装程序通常包含了使用户能在计算机上...

    session中merge和update的区别

    Hibernate中session的merge以及update方法

    two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge

    标题中的"two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge"指的是一个采用两阶段归并排序算法的程序或文档集合。这个算法是针对大数据量、无法一次性加载到内存中的情况设计的,常见于外部排序...

    npm-merge-driver-install:一个软件包,用于在本地自动安装npm-merge-driver

    npm-merge-driver安装 自动合并package-lock.json冲突的软件包。 很大程度上基于 ,在软件包安装时进行自动设置,并且只有一个小的依赖项来进行ci检查。 用生成的目录 安装 安装运行 npm i --save-dev npm-...

    WinMerge-2.16.24-x64-Setup.exe

    WinMerge-2.16.24,2022年10月版本

    yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼merge-data-qffrm.zip

    yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼merge_data-qffrm.zip;yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼merge_data-qffrm.zip;yolo算法-道路破损-缺陷数据集-18514张图像带标签-坑洼...

    winmerge-2.16.6-x64-exe.zip

    WinMerge是一款功能强大的文本和文件夹比较工具,尤其在Windows操作系统环境下广受欢迎。这款软件是开源的,这意味着它的源代码对公众开放,用户可以自由使用、修改和分发。WinMerge 2.16.6-x64-exe.zip这个压缩包...

Global site tag (gtag.js) - Google Analytics