首页 > 其他分享 >Hibernate之update(1)——更新部分字段

Hibernate之update(1)——更新部分字段

时间:2023-05-15 13:31:48浏览次数:25  
标签:Hibernate set age update 更新 session Teacher



Hibernate 中如果直接使用Session.update(Object o),会把这个表中的所有字段更新一遍。
如果你没有对你需要更新的字段以外的字段赋值,那么这些字段会被置空。

public class TeacherTest
{
   @Test
   public void update()
   {
      Session session = HibernateUitl.getSessionFactory().getCurrentSession();
      session.beginTransaction();
      Teacher t = (Teacher) session.get(Teacher.class, 3);
      t.setName("yangtb2");
      session.update(t);
      session.getTransaction().commit();
   }
}


Hibernate 执行的SQL语句:


Hibernate: 

update 

Teacher 

set 

age=?, 

birthday=?, 

name=?, 

title=? 

where 

id=?



我们只更改了Name属性,而Hibernate 的sql语句把所有字段都更改了一次。


这样要是我们有字段是文本类型,这个类型存储的内容是几千,几万字,这样效率会很低。



那么怎么只更改我们更新的字段呢?有三中方法:



[b]1.XML中设置property 标签 update = "false" ,如下:我们设置 age 这个属性在更改中不做更改[/b]


<property name="age" update="false"></property>
<property name="age" update="false"></property>


[b]在Annotation中在属性GET方法上加上@Column(updatable=false)[/b]


@Column(updatable=false) 
   public int getAge() { 
   return age; 
}


我们在执行 Update方法会发现,age 属性不会被更改


Hibernate: 

update 

Teacher 

set 

birthday=?, 

name=?, 

title=? 

where 

id=?

缺点:不灵活



[b]2.使用XML中的 dynamic-update="true"[/b]


<class name="com.sccin.entity.Student" table="student" dynamic-update="true">
<class name="com.sccin.entity.Student" table="student" dynamic-update="true">


OK,这样就不需要在字段上设置了。


[color=red]但这样的方法在Annotation中没有[/color]




[b]3.第三种方式:使用HQL语句(灵活,方便)[/b]


使用HQL语句修改数据


public void update()
{ 
   Session session = HibernateUitl.getSessionFactory().getCurrentSession(); 
   session.beginTransaction(); 
   Query query = session.createQuery("update Teacher t set t.name = 'yangtianb',t.age = '20' where id = 3"); 
   query.executeUpdate(); 
   session.getTransaction().commit(); 
}


注意:更新每个字段之间的逗号不可少,否则报错。



Hibernate 执行的SQL语句:


Hibernate:


update


Teacher


set


name='yangtianb', age='20'


where


id=3


这样就只更新了我们更新的字段


自己整理的一些方法:


1、使用hidden标签,把不需要的字段也查出来,然后在返回去。


2、再查一边数据库,声明一个新的对象,再把页面传过来的数据set进去,保存这个新声明的对象



标签:Hibernate,set,age,update,更新,session,Teacher
From: https://blog.51cto.com/u_3871599/6277961

相关文章

  • Unity 热更新学习笔记二:异步加载
    在学习异步加载前应该学习一下Untiy中如何进行性能分析为什么热更新要学习性能分析?在热更新的过程其实也就是一种资源加载的过程,而涉及到资源加载就不得不提性能分析。因为资源的加载通常是异步加载的,如果把资源都统合在一起加载游戏界面就会卡住,这是我们不希望发生的事情。Unt......
  • MySQL(四) 数据表的插入、更新、删除数据
    一、插入数据格式:INSERTINTO表名(字段名...)VALUES(值...);创建环境使用person表CREATETABLEperson(idINTUNSIGNEDNOTNULLAUTO_INCREMENT,nameCH......
  • LabVIEW数据库Mysql数据库操作;增加-删除-更新-查询;数据管理程序,完整案例,可移植。
    LabVIEW数据库Mysql数据库操作;增加-删除-更新-查询;数据管理程序,完整案例,可移植。ID:9299673612213945......
  • VMware vSphere 8 Update 1 新增功能
    VMwarevSphere8Update1新增功能请访问原文链接:https://sysin.org/blog/vmware-vsphere-8-u1-whats-new/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgvSphere8.0Update1现已发布:VMwarevSphere8.0Update1-企业级工作负载平台(CustomImageUpdate)......
  • JavaSE面试题【长期更新】
    面试题1包装类型的缓存机制了解过么包装类型的缓存机制了解过么/*ByteShortIntegerLong底层维护一个[-128,127]的缓存数组来提升性能Character底层维护一个[0,127]的数组Boolean包装类型直接返回true或者false*/2自动装箱和拆箱底层原理答案/*装箱将......
  • 正余弦优化算法(SCA)文章复现(非线权重改进位置更新+Levy飞行扰动策略+ABC算法思想)—
    正余弦优化算法(SCA)文章复现(非线权重改进位置更新+Levy飞行扰动策略+ABC算法思想)——SCASL复现内容包括:文章改进SCA算法实现、23个基准测试函数、文中相关因子分析、与SCA对比等。代码基本上每一步都有注释,非常易懂,代码质量极高,便于新手学习和理解。ID:23596702235796......
  • 缎蓝园丁鸟优化算法(SBO)文章复现(非均匀变异策略+非线性权重改进位置更新+互利因子改进
    缎蓝园丁鸟优化算法(SBO)文章复现(非均匀变异策略+非线性权重改进位置更新+互利因子改进位置更新)——ISBO。复现内容包括:改进算法实现、23个基准测试函数、文中相关因子分析、文中相关图分析、与SBO对比等。代码基本上每一步都有注释,非常易懂,代码质量极高,便于新手学习和理解......
  • 黏菌优化算法(SMA)文章复现(改进位置更新策略+自适应决策策略+反向学习更新策略)——AOSMA
    黏菌优化算法(SMA)文章复现(改进位置更新策略+自适应决策策略+反向学习更新策略)——AOSMA。复现内容包括:改进算法实现、23个基准测试函数、多次实验运行并计算均值标准差等统计量、与SMA对比等。代码基本上每一步都有注释,非常易懂,代码质量极高,便于新手学习和理解。ID:24596......
  • git项目换行符LF与CRLF不同导致的更新问题
    转载自jiayaoO3O'sBlog。遇到的问题在windows中gitclone一个代码仓库,拷贝到ubuntu环境下,出现了所有文件都被git记录已更改的问题,但肉眼看不出来文件不同。原因是windows中默认换行用的CRLF(回车+换行),而linux环境下默认用的LF(换行),于是所有文件都被标注被更改。解决方法git有......
  • 前端项目更新的缓存问题
    问题描述:微信公众号前端项目更新总会遇到不会加载最新代码问题,需要进行多次刷新或手动清空微信缓存。问题分析:1、前端项目本身是否存在缓存配置;2、nginx是否存在缓存配置。解决方案:在前端项目配置做过动态hash处理的前提下,更新后构建输出的cssjs图片等文件会被重新请......