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更新部分字段浅谈的更多相关文章

  1. Hibernate 更新部分字段的实现

    在Hibernate 中,有时我们只需要更新部分字段,此时如果使用update()方法,会将所有字段都更新,对于没有set的字段,就会设置成NULL,如果这些字段里面有非空的字段就会报错. 解决的方法 ...

  2. Hibernate更新某些字段的几种update方法

    Hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: public class TeacherTest { @Test pu ...

  3. 浅谈cache

    2021.9.22更新: <浅谈Cache Memory> http://blog.sina.com.cn/s/blog_6472c4cc0102dusv.html 为什么贴上这个链接呢, ...

  4. hibernate update 只更新部分字段的3种方法(转载)

    hibernate 中如果直接使用 Session.update(Object o); 会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test p ...

  5. hibernate update 只更新部分字段的3种方法(其实我只想说第二种)

    hibernate 中如果直接使用Session.update(Object o);会把这个表中的所有字段更新一遍. 比如: public class Teacher Test { @Test pub ...

  6. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  7. 【架构】浅谈web网站架构演变过程

    浅谈web网站架构演变过程   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系统可以如何一步步演变.   该系统具备的功能:   用户模块:用户注册和管理 商品模块:商品展示和管 ...

  8. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  9. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

随机推荐

  1. 格而知之15:我所理解的Block(1)

    1.Block 本质上是一个struct结构体,在这个结构体中,最重要的成员是一个函数(当然除函数外还有其他重要的成员). 2.在开始解析Block之前,首先来回顾一下Block的格式.Block相关 ...

  2. Android应用程序进程启动过程的源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址: http://blog.csdn.net/luoshengyang/article/details/6747696 Android 应用程序框架层创 ...

  3. SQL语句中的DQL、DML、DCL、DDL、CCL、TPL

    结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统:同时也是数据库 ...

  4. Asp.net开发常用的51个非常实用的代码

    1.弹出对话框.点击转向指定页面 Code: Response.Write("<script>window.alert('该会员没有提交申请,请重新提交!')</scrip ...

  5. 对list代理扩展功能

    package 动态代理扩展List; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; imp ...

  6. iOS_block内存分析

    ----------------------MRC情况下Block内存分析---------------------------- 1.如果在block中使用全局变量,他为了持有这个变量,会将对应的对 ...

  7. VS2015预览版中的C#6.0 新功能(一)

    VS2015预览版中的C#6.0 新功能(二) VS2015预览版中的C#6.0 新功能(三) VS2015的预览版在11月12日发布了,下面让我们来看看C#都提供了哪些新的功能. 字符串添写(Str ...

  8. QT5.5实现串口通信

    QT5.1以上版本自带QtSerialPort集成库,只要在头文件中集成 #include <QtSerialPort/QSerialPort> #include <QtSerial ...

  9. VS2012 运行项目在IE中可以运行,但是在google和firefox却不能打开。

    笔记本重装了系统之后,打开VS2012 调试的时候,发现在IE下能够运行调试.net项目,但是使用google和firefox的时候却不能打开项目.苦思冥想不知道是怎么回事儿,后来经过在网上查阅各种资 ...

  10. shell启动时读取的配置文件

    bash shell具体可以分为3种类型,这3种类型为: 1 login shell 就是需要输入用户名和密码才能登陆的shell 2 可交互的非login shell 就是不用登陆的,但是可以同用户 ...