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 n+1问题 Hibernate 是一个基于Java的持久层框架,它提供了对数据库的访问和管理功能。在使用 Hibernate 进行数据访问时,经常会遇到一个问题,即 n+1 问题。该问题是指在一次数据库查询中,需要执行...
浅谈hibernate之映射文件VS映射注解 在Java开发中,注解是一种非常常用的技术,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法。注解可以简单地理解为一种有特殊含义的标记。在开发过程中,...
浅谈Spring自定义注解从入门到精通 在业务开发过程中,我们经常会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求。这时,我们可以自定义注解来满足我们的需求。根据注解使用的位置,文章将...
“浅谈 JavaWeb 编程中页面跳转与数据共享”讨论了在JavaWeb开发中实现页面跳转和数据共享的策略;最后,“基于JavaWeb Start技术的VFP考试系统的设计与实现”展示了如何运用JavaWeb技术来构建考试系统,实现自动化...
少儿编程scratch项目源代码文件案例素材-直升机飞行.zip
wanjunshe_Python-Tensorflow_12888_1745868924470
健康监测_Android开发_BLE蓝牙通信_心率数据采集与存储_基于小米手环2的实时心率监测应用_支持后台长时间运行的心率记录工具_可导出SQLite数据库的心率数据分析系统_适
少儿编程scratch项目源代码文件案例素材-种花模拟器.zip
嵌入式系统开发_FreeRTOS实时操作系统_STM32F103C8T6微控制器_OLED显示屏_DHT11温湿度传感器_多任务调度_多级菜单设计_万年历算法_电子闹钟功能_参数配
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
scratch少儿编程逻辑思维游戏源码-猫猫粉碎.zip
scratch少儿编程逻辑思维游戏源码-蓝胡子.zip
scratch少儿编程逻辑思维游戏源码-美食大亨.zip
scratch少儿编程逻辑思维游戏源码-洛克人.zip
scratch少儿编程逻辑思维游戏源码-龙冲刺.zip
思幻个人引导页V2.2版本11月29日更新.zip
scratch少儿编程逻辑思维游戏源码-骑士风斩法.zip
移动应用开发_H5CSS3ionicng-cordovaMVVM模式_基于HTML5和CSS3技术实现多页面布局ionic指令数据绑定ui-route单页跳转调用手机
少儿编程scratch项目源代码文件案例素材-植物大战僵尸创造版 Ver. 1.0.3.zip
scratch少儿编程逻辑思维游戏源码-日落(2).zip