jpa @dynamicupdate
时间: 2023-05-04 16:02:35 浏览: 153
JPA @dynamicupdate注解是一种用于实体类属性更新操作的注解。在默认情况下,当我们使用实体类对象执行更新操作时,JPA会将实体类中所有的属性都更新到数据库中,这种方式有时候会浪费数据库资源,而且并不都是必要的。在某些情况下,我们只需要更新实体类中某些属性的值,而不是全部属性的值,这时就可以使用@DynamicUpdate注解。该注解将只会更新那些在应用中被修改了的属性,而不是全部属性。
使用@DynamicUpdate注解需要注意以下几点:
1. 只有在更新操作中才会生效,对于新增操作没有任何作用;
2. 如果一个实体类中的某个字段设置了@Transient注解,则不会被更新;
3. 同一个事务中,如果在更新了一个实体类后再更新同一个实体类,后续的更新操作会被JPA忽略掉,因为在第一次更新实体类时,JPA已经把实体类中所有的属性都更新到数据库中了。
相关问题
package org.example.application.custom.entity; import lombok.Getter; import lombok.Setter; import org.example.application.common.base.BaseEntity_Jpa; import org.example.application.system.entity.SysUser; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import java.time.LocalDate; @Getter @Setter @Entity @DynamicUpdate @DynamicInsert public class Free extends BaseEntity_Jpa { @Column(columnDefinition = "timestamp comment '请假时间'") private LocalDate startTime; @Column(columnDefinition = "longtext comment '地点'") private String address; @Column(columnDefinition = "longtext comment '原因'") private String why; @JoinColumn @ManyToOne private SysUser user; @Column(columnDefinition = "tinyint default 1 comment '审核状态 1:待审核 2:审核通过 3:拒绝'") private Integer checkStatus; }
这是一个 Java 类的代码,它定义了一个名为 Free 的实体类。它使用了 lombok 的注解来简化代码,如 @Getter、@Setter 等。该类继承了 BaseEntity_Jpa 类,包含了一些属性,如 startTime、address、why、user 和 checkStatus 等。其中,startTime 是一个 LocalDate 类型的属性,address 和 why 是字符串类型的属性,user 是 SysUser 类型的对象,checkStatus 是一个整数类型的属性。该类使用了 JPA 的注解来映射数据库表,如 @Entity、@Column、@JoinColumn、@ManyToOne 等。另外,还使用了 hibernate 的注解,如 @DynamicUpdate、@DynamicInsert 等来实现动态更新和插入。
jpa save null
在使用JPA的save方法时,如果直接在查出的实体上设置某字段为null并保存,由于session缓存的原因,仍然会将null字段保存到数据库中。这可能会覆盖数据库中原有的数据,这是一个很可怕的行为。为了解决这个问题,有几种方法可以尝试:
1. 在实体类上添加@DynamicInsert(true)/@DynamicUpdate(true)注解。这样会在执行保存操作时,只会将非null字段保存到数据库中,null字段将被忽略。
2. 可以扩展SimpleJpaRepository,并覆盖save方法,在保存实体前对null字段进行处理,使其不保存到数据库中。
3. 在启动类上添加@EnableJpaRepositories(repositoryBaseClass = ZeusJpaRepository.class)注解,将自定义的JpaRepository作为基础类,然后在自定义的JpaRepository中处理null字段的保存逻辑。
这些方法可以帮助你在使用JPA的save方法时避免保存null值到数据库中。请根据你的具体需求选择合适的方法来解决这个问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [JPA踩坑记:Spring Data Jpa 更新为null的问题(save方法保存时null值会被更新到数据库)](https://blog.csdn.net/adu003/article/details/105294362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文