关于@DynamicUpdate的误解

栏目: 数据库 · 发布时间: 5年前

内容简介:二话不说,先把@DynamicUpdate的官方api-doc呈出来(如下图),参见https://docs.jboss.org/hibernate/stable/orm/javadocs/翻译成白话文:先说明一下@DynamicUpdate注解用在实体类上

二话不说,先把@DynamicUpdate的官方api-doc呈出来(如下图),参见https://docs.jboss.org/hibernate/stable/orm/javadocs/

关于@DynamicUpdate的误解

翻译成白话文:

  • 对于更新,此实体是否应在使用动态 sql 生成时,仅在预处理sql语句中引用已更改的列。
  • 请注意,对于重新附加分离的实体,如果未启用select-before-update,则无法执行此操作。

举栗子

先说明一下@DynamicUpdate注解用在实体类上

有数据库表tbl_foo和对应的实体类Foo,如下:

id name col3 col4 col5
1 毕加索 1770 奥地利
class Foo{
    private Integer id;
    private String name;
    private String col3;
    private String col4;
    private String col5;
    getter...
    setter...
}
复制代码

在Service中更新id=1记录的name属性,代码如下:

Foo foo = fooDao.findById(1);
foo.setName("贝多芬");
fooDao.save(foo);
复制代码

两种情况:

  1. 在entity类中未使用@DynamicUpdate注解或使用了@DynamicUpdate(false),那么Hibernate底层执行的sql如:
update tbl_foo set name=?, col3=?, col4=?, col5=? where id=?
复制代码
  1. 在entity类中使用了@DynamicUpdate注解(或@DynamicUpdate(true)),Hibernate底层执行的sql如:
update tbl_foo set name=? where id=?
复制代码

以上两种情况对数据库更新的结果是等效的,但是使用@DynamicUpdate性能会好一些。因为不使用@DynamicUpdate时,即使没有改变的字段也会被更新。如果进行频繁的更新操作,并且每次只更新少数字段,那么@DynamicUpdate对性能的优化效果还是很好的。

误解

我们常有一种需求,web层用对象接收前端要修改的属性值(不修改的值为空),我们希望直接调用dao的update方法进行选择更新。

web层使用对象接收前端要修改的属性值,可等效看做执行如下代码:

Foo foo = new Foo();
foo.setId(1);
foo.setName("贝多芬");
复制代码

这时服务层直接使用这个对象进行更新

fooDao.update(foo);
复制代码

我们期待的结果:

id name col3 col4 col5
1 贝多芬 1770 奥地利

看到网上有些文章说在实体类加上@DynamicUpdate,就可以满足我们的以上需求,但是很遗憾,不然!

反而得到这样的结果是:

id name col3 col4 col5
1 贝多芬

只要完全理解了api-doc中对@DynamicUpdat的说明,就很容易知道得到这个结果的原因了。@DynamicUpdate的动态更新的含义是,比较更新要使用的实体类中的字段值与从数据库中查询出来的字段值,判断其是否有修改。看这个例子,数据库中id=1的记录所有字段都是非空的,但是实体类中只有name有值,也就是所有字段都变了,只是其他字段被更新为了新的空值。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

组合数学

组合数学

(美)Richard A. Brualdi / 冯速 等 / 机械工业出版社 / 2012-5 / 69.00元

本书是系统阐述组合数学基础、理论、方法和实例的优秀教材,出版三十多年来多次改版,被MIT、哥伦比亚大学、UIUC、威斯康星大学等众多国外高校采用,对国内外组合数学教学产生了较大影响,也是相关学科的主要参考文献之一。 本书侧重于组合数学的概念和思想,包括鸽巢原理、计数技术、排列与组合、P條ya计数法、二项式系数、容斥原理、生成函数和递推关系以及组合结构(匹配、试验设计、图)等,深入浅出地表达了......一起来看看 《组合数学》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码