Hibernate 有选择性的更新--控制insert和update语句

简介:

Hibernate 有选择性的更新--控制insert和update语句

项目请情景:Hibernate 更新部分字段。

项目中Hibernate更新记录时,不想更新所有字段怎么办?如果更新页面将不需要显示的字段不列出来。则更新后,数据库中这些记录会被设置成null。原因(看下后台执行的SQL语句)如下:

Hibernate在初始化阶段,会根据映射文件的映射信息,为所有的持久化类预定义insert、update、delete 、根据OID从数据库加载持久化类实例的select语句 的Sql语句。

默认情况下,预定义的SQL语句中包含了表的所有字段。更新页面:如果不需要更新的字段没有显示的话。直接提交,则数据库中registerTime、 username会被置为null值。

(常规更新的时候,更新页面不显示这几个字段。如果username不允许为空的话,

根本不允许保存,更新报错。有一个办法是设置一个隐藏域。保存这个要传输的值。但是这样不是根本的解决办法!主键的id是要传送进去的。)

下面的实例中 设置 username status registerTime userGroupId 不允许更新!

解决办法:设置update、insert、mutable、dynamic-insert、dynamic-update 属性!

可以参考后台打印输出的SQL。

①之前没有设置执行的SQL语句执行情况:

 
  1. Hibernate: update orderSys.dbo.order_user 
  2. set userGroupId=?, username=?, password=?, sex=?, 
  3. email=?, status=?, cellphone=?, mobialphone=?, registertime=?, 
  4. number=?, name=?, QQ=? where id=?  
  5.  

②设置属性之后的SQL语句执行情况:

 
  1. Hibernate: update orderSys.dbo.order_user 
  2. set password=?, sex=?, email=?, cellphone=?, mobialphone=?, 
  3. number=?, name=?, QQ=? where id=? 

由此可见  更新成功!

下面附上属性的介绍:

 update、insert、mutable、dynamic-insert、dynamic-update 属性作用如下表。

属性 作用
<property>的insert属性  设置为false,则在insert语句中不包含该字段,即该字段永远不能被插入。默认值:true.
<property>的update属性 设置为false,则在update语句中不包含该字段,即该字段永远不能更新。默认值:true.
<property>的mutable属性 设置为false,则所有<property>元素的update属性为false,即该整个实例不能更新。默认值:true.
<class>的dynamic-insert属性 设置为true,则表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含所有取值不为null的字段。默认值:false
<class>的dynamic-update属性 设置为true,则表示当更新一个对象时,会动态生成update语句,update语句中仅包含所有取值需要更新的字段。默认值:false





 本文转自 w156445045 51CTO博客,原文链接:http://blog.51cto.com/enetq/674083,如需转载请自行联系原作者


相关文章
|
2月前
|
SQL 测试技术 数据库
`SELECT ... FOR UPDATE` 语句是如何工作的?
`SELECT ... FOR UPDATE` 语句是如何工作的?
83 0
|
3月前
|
SQL IDE Java
hibernate5 增加、修改、删除和执行SQL
hibernate5 增加、修改、删除和执行SQL
13 0
|
4月前
|
SQL 存储 Java
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
36 0
|
7月前
数据更新语句INSERT语句、UPDATE语句、DELETE语句等,用于向数据表中插入、更新或删除数据。示例
数据更新语句INSERT语句、UPDATE语句、DELETE语句等,用于向数据表中插入、更新或删除数据。示例
55 1
|
10月前
|
SQL 关系型数据库 MySQL
使用tkmapper避免更新on update字段
使用tkmapper避免更新on update字段
101 0
|
11月前
|
SQL 关系型数据库 数据库
如何实现update select 语句
​ 这次的文章出现也是因为这样一个类似的需求,个人需要把一个30万行(后续会发文介绍常见的处理手段)的数据文件入库,同时需要将部分字段迁移到另一张表,两个表之间通过两个字段进行and匹配。
160 0
|
SQL 数据库管理
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
本篇文章讲解的主要内容是:***你有没有经历过一个update把其他列数据清空了、使用merge更新合并记录、删除违反参照完整性的记录、给你五种删除重复数据的写法*** 【SQL开发实战技巧】这一系列博主当作复习旧知识来进行写作,毕竟SQL开发在数据分析场景非常重要且基础,面试也会经常问SQL开发和调优经验,相信当我写完这一系列文章,也能再有所收获,未来面对SQL面试也能游刃有余~。
【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
|
SQL 存储 缓存
执行update语句,用没用到索引,区别大吗?
我们都知道,当执行 select 查询语句时,用没用到索引区别是很大的,若没用到索引,一条 select 语句可能执行好几秒或更久,若使用到索引则可能瞬间完成。那么当执行 update 语句时,用没用到索引有什么区别呢,执行时间相差大吗?本篇文章我们一起来探究下。
352 0
【ThinkPhp3.2】关于update指定了条件,但是进行了全表更新
【ThinkPhp3.2】关于update指定了条件,但是进行了全表更新
175 0
【ThinkPhp3.2】关于update指定了条件,但是进行了全表更新
|
SQL 关系型数据库 MySQL
MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
1966 0