Hibernate---JPA注解@DynamicUpdate与@DynamicInsert

Java动态实体:@DynamicInsert和@DynamicUpdate的应用 DynamicInsert和@DynamicUpdate注解为Java应用的数据持久化层提供了精细化的性能优化工具。通过动态生成仅包含必要字段的SQL语句,这些注解有效减少了网络传输开销和数据库处理负担,特别是在处理大型实体对象和频繁的部分字段更新场景中展现出显著优势。合理使用这些注解需要综合考虑实体复杂度、业务更新模式和系统性能需求,并建立相应的监控机制来评估优化效果。在现代企业级应用中,掌握动态实体技术不仅能够提升应用性能,更是构建高效数据访问层的重要技术手段。 阅读详情

@DynamicInsert属性(默认为false):

如果将其设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中。

比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。

@DynamicUpdate属性(默认为false):

如果将其设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中。

比如只想更新某个属性,我更改了哪些字段,只会更新我们修改的字段。

 

效果:

这两个注解在一定程度上可以增加与数据库操作相关的速度,可以节省SQL语句的执行时间,提高程序的运行效率。

使用这两个注解只需要在实体类上加入即可,或者在*.hbm.xml配置。这两个注解是boolean值,true或者false。

实体类

/**
 * @description: TODO
 * @author: PIPI
 */
@Entity
@Table(name="Room")
@Data
@DynamicUpdate
public class Room implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(nullable = false, unique = true)
    private Integer roomId;

    private String roomNumber;

    private Integer aricNum;//空调数

    private Integer lightNum;

    private Integer fanNum;

    private Integer switchNum;

    private Integer deskNum;

    private Integer chairNum;

    private Integer nediaNum;//多媒体数

    private Integer clockNum;//

    private Integer boardNum;

    private Integer roomStatus;

    private Integer roomType;//区分教室和休息室

    private Integer teaDesk;

    private Integer sofa;

    private Integer Sterilizer;//消毒柜

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH},
            fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "building_id")
    @NotFound(action=NotFoundAction.IGNORE)
    private Building building;

    @ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH},
            fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "floor_id")
    @NotFound(action=NotFoundAction.IGNORE)
    private Floor floor;

    @JsonIgnore
    @ManyToMany(mappedBy = "rooms", fetch = FetchType.EAGER, cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    private Set<Cleaner> cleaners=new HashSet<Cleaner>();

}

测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class RoomRepositoryTest {
    @Autowired
    private RoomRepository roomRepository;

    @Test
    @Transactional
    public void flushOne(){
        Room room = roomRepository.getOne(476);
        room.setChairNum(130);
        roomRepository.saveAndFlush(room);
    }
}

没加注解@DynamicUpdate,sql语句为:

Hibernate: update room set sterilizer=?, aric_num=?, board_num=?, building_id=?, chair_num=?, clock_num=?, desk_num=?, fan_num=?, floor_id=?, light_num=?, nedia_num=?, room_number=?, room_status=?, room_type=?, sofa=?, switch_num=?, tea_desk=? where room_id=?

我只更新了chairNum这个属性,但是却把整个对象的属性都更新了,这在一定程度是影响了效率。而且可能并不是我们希望的结果,我们希望的结果是我更改了哪些


加了注解@DynamicUpdate,sql语句为:

Hibernate: update room set chair_num=? where room_id=?

结论:

在Hibernate中可以利用@DynamicInsert和@DynamicUpdate生成动态SQL语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。

 

JPA 中 @DynamicInsert 和 @DynamicUpdate注解的使用 @DynamicInsert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句中,默认false。 比如希望数据库插入日期或时间戳字段时,在对象字段为空定的情况下,表字段能自动填写当前的sysdate。 @DynamicUpdate属性:设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false。 比如只想更新某个属性,但是却把整个属性都更 阅读详情

相关推荐

使用Hibernate的@DynamicInsert和@DynamicUpdate生成动态SQL语句

然而,需要注意的是,这些注解只是在生成SQL语句时起作用,对数据库中的数据结构没有影响。Hibernate提供了@DynamicInsert和@DynamicUpdate注解来支持生成动态的SQL语句,从而实现灵活的字段更新。@DynamicUpdate注解的作用是告诉Hibernate在执行更新操作时,只更新实体对象中发生变化的字段,忽略未发生变化的字段。这样可以减少不必要的更新操作,提高性能。@DynamicInsert注解的作用是告诉Hibernate在执行插入操作时,只插入非空字段,忽略空字段。

DevGlider的博客 790

Spring Data JPA使用@DynamicUpdate注解进行Update部分更新

当然,在某些情况下,我们应该使用此注释 — 例如,如果一个实体表示一个具有大量列的表,并且只需要经常更新其中的几列。如果我们更新实体,修改后的列的值将传递给 SQL 更新语句。因此,当我们更改实体的任何字段时,它会比较实体的当前状态和修改状态。我们可以看到,Hibernate 生成的 SQL 在这种情况下,只包含。相反,每次我们更新实体时,它都会生成一个 SQL 语句。当我们在Hibernate中使用Spring Data JPA时,我们也可以使用Hibernate的附加功能。实际上,当我们在实体上使用。

allway2的博客 6117

spring data jpa 动态更新@DynamicUpdate

NULL 博文链接:https://913.iteye.com/blog/2397146

jpa的@DynamicUpdate失效源于对其的误解;jpa的id定义(使用数据库自增)

jpa

奔跑的菜鸡 5094

Fofa API高阶玩法:用Python批量获取漏洞资产(含OA系统扫描实战)

本文详细介绍了如何利用Python结合Fofa API实现自动化漏洞资产收集的高阶实战技巧。通过构建健壮的客户端、设计精准查询语法、实现多线程批量采集,并以OA系统漏洞扫描为例,演示了从资产发现、过滤验证到报告生成的全流程,旨在提升安全运维与应急响应的效率。

weixin_28607671的博客 498

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL)

本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。

weixin_28338005的博客 238

JPA、Hibernate注解@DynamicInsert和@DynamicUpdate

@DynamicInsert 使用该注解默认值(true)可以让Hibernate在插入时生成动态语句时忽略空值对应的列。 /** * For inserting, should this entity use dynamic sql generation where only non-null columns get referenced in the * prepared sql statement? * * @author Steve Ebersole */ @Target( TYPE )

z185665096的专栏 390

innovus实战攻略 | 用setUsefulSkewMode解锁时序优化的“隐藏技能”!

就像时序优化的“瑞士军刀”,参数虽多,但掌握了分类逻辑后,用起来其实很简单!如果你有更绝的用法,欢迎在评论区分享,大家一起卷起来!简单来说,它就是时序优化的“乾坤大挪移”。通过调整触发器的时钟到达时间,把关键路径的建立时间“借”给非关键路径,从而实现全局时序收敛。别急,这个命令就是你的“时序救星”!(工具最多只能借1.2ns的裕量,防止“借过头”导致新问题!这个参数能帮你兜底!(对关键路径“下死手”,确保优化到位!(设置上限,给工具套上“紧箍咒”!(直接跳过边界,避免优化反噬!(全局管理,防止“借过头”!

weixin_50820814的博客 1355

Hibernate,JPA注解@DynamicInsert和@DynamicUpdate,Hibernate如何插入sysdate

@DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。 比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。 @DynamicUpdate属性:设置为true,设置为true,表示update对象的时候,...

weixin_34364135的博客 353

机载电脑与飞控串口通信(实测读取飞控IMU数据)《一、香橙派5max启动串口UART通信与飞控板通信,一次必通!》《二、allspark1与PIX6C通信踩坑及出坑》《三、orinnx载板与飞控通信》

机载电脑与飞控串口通信(实测读取飞控IMU数据)《一、香橙派5max启动串口UART通信与雷迅v5nano飞控板通信,一次必通!》《二、阿木机载电脑allspark1与PIX6C通信踩坑及出坑》,还有如何打开飞控串口以及如何提高飞控IMU频率。

2402_82745259的博客 3469

电源完整性之仿真设计原理

电源完整性(Power Integrity),简称为PI,也就是大家平常听说的PI。PCB板上的电源设计也是非常重要的,不当的设计也会引起很重要的影响。所以电源完整性PI和信号完整性SI,是我们互连设计人员应该同等重视的问题。今天整理本人接触的电源完整性PI的一些原理,从不的角度去看PI,会有不同的理解,下面开始喽!!! 提到互连的电源设计,可能首先想到的电源分配网络(Power Distribution Nets),因为互连电源会有许多种,直流DC和交流AC,还有不同的电压调节模块(VRM)与不同的负载端

刘小同学的博客 7373

JPA @DynamicInsert()注解自动更新当前时间到MySQL数据库中

import lombok.Data; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import org.springframework.data.annotation.CreatedDate; import org.springframework...

mingdsa的博客 1088

具身智能:原理、算法与系统 第18章 模仿学习与人类示范

与基于试错机制的强化学习不同,模仿学习假设存在能够提供高质量轨迹示范的专家策略,学习者的目标是在不直接访问专家内部决策机制的情况下,复现或泛化专家的行为模式。此外,选项 GAIL(Option-GAIL)将分层强化学习与对抗模仿结合,学习选项(Options)级别的策略,能够捕捉专家示范中的多模态行为与高层意图。X-Sim 框架提出从真实到模拟再到真实的迁移路径:首先从人类视频中重建物理仿真环境,在仿真中训练状态级策略,随后通过策略蒸馏获得基于视觉的策略,最后通过在线领域自适应对齐真实与仿真观测。

VectorShift的博客 125

Jpa 插入更新如何过滤null值

使用Jpa时,默认的save方法会将entity中null的值也更新到数据库,这对与存在默认值或者更新接口将直接导致错误的记录产生,那么如何解决这个问题? Hibernate提供了两个注解 @DynamicInsert: For inserting, should this entity use dynamic sql generation where only non-null columns get referenced in the prepared sql statement? @Dyn

神经病上来逛一下的专栏 3997

【即插即用模块】注意力篇 | MICCAI 2023 | MFE:多尺度特征提取,告别固定感受野,猛涨2个点!

本文提出一种用于低分辨率乳腺癌病理图像超分辨率与分类的网络SHISRCNet。针对现有方法处理低分辨率图像效果差、感受野固定等问题,设计了多特征提取模块(MFE),通过多速率空洞卷积覆盖全尺度感受野(局部到全局),结合递进残差连接和动态权重融合机制,实现自适应多尺度特征增强。实验表明,该模块在超分辨率任务中PSNR提升近2个点,分类准确率显著提高。代码提供详细注释,支持即插即用,适用于各类多尺度视觉任务。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 206

交货单冲销发货过账的正确姿势:用 VL09 与 ABAP 批量反冲 Goods Issue

摘要 本文详细解析了SAP系统中VL09事务码的技术实现与业务应用。VL09用于反冲发货的货物移动,通过标准冲销路径(移动类型602冲销601)确保单据链路一致、状态机正确回退和业务规则生效。文章对比了经典VL09与Fiori应用在不同SAP产品形态中的位置,并针对STO场景提供了ME23N验证方法。核心内容包括WS_REVERSE_GOODS_ISSUE函数模块的调用要点、必须COMMIT的原因(SAP LUW机制),以及处理Handling Unit等限制条件的注意事项。最后给出了将VL09工程化的项目

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 590

使用JPA,插入(或者修改)数据的时候使用数据库表的default值

使用JPA的时候,当我们插入数据的时候,我们不仅可以自己在model类里面赋初值,还可以使用数据库表的default值。 首先,我们在model类里面为column设置数据库default值,以前使用Hibernate的时候的做法是添加sql-type,例如: 在JPA里面使用columnDefinition代替sql-type: @Column...

fege_fege的专栏 1050

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jpa删除数据后数据库无修改_JPA插入或者修改数据的时候使用数据库表的default值(JPA动态插入动态更新)...

使用让我们开始进行JPA学习吧。首先,我们在model类里面为column设置数据库default值,以前使用Hibernate的时候的做法是添加sql-type,例如:在JPA里面使用columnDefinition代替sql-type:@Column(columnDefinition="datetime default getdate()")@Temporal(javax.persistenc...

weixin_29499829的博客 444

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

一些比较重要的注解

@DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。 比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。(Hibernate,JPA注解) @DynamicUpdate属性:设置为true...

LuckyTHP 167

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java获取mysql表创建时间_关于Java中集成mysql(springboot)处理数据创建时间和最后更新时间的总结...

关于Java中集成mysql(springboot)处理数据创建时间和最后更新时间的总结​在服务端开发中,经常会遇到需要记录数据库记录的创建时间与更新时间,往常的时候只是把别人的代码粘贴过来用了,也没有实际整理过;近几天通过网上搜索及实际测试整理出一套结论网上目前主要流传有4种解决方案,但是有一些方案确实并不合适,以下是自己整理的以下实测结果及最终推荐方案,请参考指正1 在数据库表设计上直接解决...

weixin_39601511的博客 702

Spring Data JPA注解@DynamicInsert、@DynamicUpdate、@MappedSuperclass

@DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。 比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。 @DynamicUpdate属性:设置为true,设置为true,表示update对象的时候,生...

Janson_Lin 1316

Spring Data Jpa的@DynamicInsert注解和@DynamicUpdate注解

当前引入的Spring Data Jpa的版本为2.4.2 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> <version>2.4.2</version> </dependency> 构建的数据库tb_us.

北辰 1460

Spring Data JPA使用@DynamicInsert和@DynamicUpdate注解进行动态插入和更新

当您保留一个新实体或使用 Spring Data JPA 更新现有实体时,您可能已经意识到您始终在执行相同的 SQL 语句,该语句设置该实体映射的所有列。如果您只更新其属性之一,情况也是如此。这是Hibernate提供的性能优化,Hibernate是Spring Data JPA默认使用的JPA实现。Hibernate试图避免检查实体的哪些属性已更改并为它们生成特定的SQL语句。

allway2的博客 2976

Spring Data JPA注解@DynamicInsert和@DynamicUpdate

Hibernate,JPA注解@DynamicInsert和@DynamicUpdate @DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。 比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。 @Dyna

只有变秃 才能变强 3万+
上一篇: IntelliJ IDEA-----常用快捷键
下一篇: 查询报错:java.lang.StackOverflowError: null
PI_PIBOY
博客等级 码龄9年 3粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值