Hibernate更新部分字段浅谈
update语句是在Hibernate的Configuration的时候生成的,不能动态改变。为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题。
如果想要做到只更新改变了的字段,必须做到两点:
1、对PO的每个属性设置version进行状态跟踪
2、update语句是动态生成的,在实际向数据库更新的时候,依次检查每个属性的version,决定哪些属性需要更新,动态构造update语句。
单单要做到上述第一点,就势必要给PO的操作带来沉重的负担,每次属性的存取都要判断version,严重影响PO的性能。会带来整个Hibernate性能的降低。而要做到第二点,临时构造update语句时间消耗很客观,也会极大降低update的速度。
Hibernate的PO状态管理是当任何属性值改变的时候,version就被标记,表明PO被更新了。实现很简单而有效,效率非常高。而update语句insert,delete和某几个select语句是在Hibernate初始化过程中就构造好了,不需要用的时候临时构造。
综合评价得与失,对PO属性进行状态管理固然可以稍微降低数据库负担,但是会极大影响Hibernate的运行效率,终究得不偿失。
这里说明一点,如果一个属性的值变为空,则hibernate也认为该属性的值已经改变,直接update操作就会将空值同步到数据库中。
以上内容是执行update操作更新改变字段的数据时hibernate的处理。这里得不出我想要的结果。因为我的需求有两点不能忽略:一、我更新的字段,数据不一定改变,这些字段一定要保证数据的同步。二、我不更新的字段,即使数据有变,也不能做同步操作。
既然动态设置一个属性的值是否改变是一件比较难的事情,那就最好转换一下思路。当然hibernate也有比较折中的方法可以处理。这里就我总结的,浅谈一下。
方式一:通过HQL或者SQL来实现。这是最笨拙的方式,具体就是写HQL或者SQL语句了,我在此就不细说。
方式二:一一设置需要更新的字段。首先,重新查询一次,然后对这个刚查询出来的对象一一设置需要改变的字段的值,然后再update。这种方式实现起来也是比较让人痛苦的,跟操作JDBC没多大区别。
方式三:在页面隐藏不需要改变的值。在修改页面,隐藏那些无需操作的字段,提交的时候hibernate会自动提交这些隐藏的字段的值。这种方式对于一个多字段的表不太适用。
方式四:在方式二的基础上进行。一一设置需要更新的字段是比较痛苦的,那有没有工具可以帮助我们处理这样的操作呢。答案是肯定的。Spring是一款很优秀的框架。它内置的BeanUtils工具类可以轻松实现这些功能,而且效率极高。BeanUtils的copyProperties方法进行了重载,其中一个如下:
org.springframework.beans.BeanUtils.copyProperties(source, target, ignoreProperties)
其中第一个参数是数据源,第二个参数是目标对象,第三个参数用来过滤哪些属性不需要进行拷贝,这样在进行更新时就方便多了。
这里没有哪一种方式更好,哪一种方式不好,具体场合具体对待吧。如果需要更新的字段远远多于需要更新的字段,建议采用方式三或者方式四。如果需要更新的字段就那么几个,则可以采用方式一或方式二。
Hibernate更新部分字段浅谈的更多相关文章
- Hibernate 更新部分字段的实现
在Hibernate 中,有时我们只需要更新部分字段,此时如果使用update()方法,会将所有字段都更新,对于没有set的字段,就会设置成NULL,如果这些字段里面有非空的字段就会报错. 解决的方法 ...
- Hibernate更新某些字段的几种update方法
Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: public class TeacherTest { @Test pu ...
- 浅谈cache
2021.9.22更新: <浅谈Cache Memory> http://blog.sina.com.cn/s/blog_6472c4cc0102dusv.html 为什么贴上这个链接呢, ...
- hibernate update 只更新部分字段的3种方法(转载)
hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test p ...
- hibernate update 只更新部分字段的3种方法(其实我只想说第二种)
hibernate 中如果直接使用Session.update(Object o);会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test pub ...
- 浅谈Android Studio3.0更新之路(遇坑必入)
>可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...
- 【架构】浅谈web网站架构演变过程
浅谈web网站架构演变过程 前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变. 该系统具备的功能: 用户模块:用户注册和管理 商品模块:商品展示和管 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
随机推荐
- add.fun.php
<?php header("Content-type: text/html; charset=utf-8"); function add($min_int,$max_int) ...
- Python 协程(gevent)
协程,又叫微线程,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上 ...
- Prototypes analyze(二叉排序树,不同树形个数)
Prototypes analyze 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 ALpha Ceiling Manufacturers (ACM) is ana ...
- POJ 1300 欧拉通路&欧拉回路
系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...
- VS2008 由于应用程序配置不正确,应用程序未能启动。重新安装应用程序可能会纠正这个问题。
提示这个错误,自己的程序是在VS2008下编译的C/C++ win32程序,自己当时在win7上开发测试,都没有问题,正常使用,也在另一台xp系统上也试了,都没有问题.就发给客户了,没想到有些客户竟然 ...
- Gradle Tips#1-tasks
原文链接 以这篇博客開始,我将写一系列关于Gradle的文章,用来记录接触Gradle构建脚本以来我所理解的Gradle. 今天要讲的就是Gradle tasks以及task的配置和运行.可能有的读者 ...
- [RxJS] Using Observable.create for fine-grained control
Sometimes, the helper methods that RxJS ships with such as fromEvent, fromPromise etc don't always p ...
- [每日一题] OCP1z0-047 :2013-07-27 外部表――不能被DML和建索引
首先看官方文档上的解释: Managing External Tables Oracle Database allows you read-only access to data in externa ...
- [置顶] 创建GitHub技术博客全攻略
[置顶] 创建GitHub技术博客全攻略 分类: GitHub2014-07-12 13:10 19710人阅读 评论(21) 收藏 举报 githubio技术博客网站生成 说明: 首先,你需要注册一 ...
- iOS获取网络时间与转换格式
[NSDate date]可以获取系统时间,但是会造成一个问题,用户可以自己修改手机系统时间,所以有时候需要用网络时间而不用系统时间.获取网络标准时间的方法: 1.先在需要的地方实现下面的代码,创 ...