更新实体传入同值时,脏检查是否仍会触发SQL查询?
问题
我正在配置实体更新方法,好奇若为实体的同一列传入与原有值相同的内容,执行脏检查时会产生何种结果。以下是对应的Member实体类代码:
public class Member extends BaseEntity { @Id @Column(name = "member_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(unique = true, nullable = false) private String email; @Column(nullable = false) private String password; @Column(unique = true, nullable = false) private String username; @Column(nullable = false) @Enumerated(EnumType.STRING) private MBTI mbti; @Column private Boolean isDeleted; @Column private String statusMessage; @Column private String avatar; public static Member toEntity(MemberRequestDto.signup requestDto) { return Member.builder() .email(requestDto.getEmail()) .password(requestDto.getPassword()) .username(requestDto.getUsername()) .mbti(requestDto.getMbti()) .statusMessage(requestDto.getStatusMessage()) .isDeleted(false) .build(); } public void update(MemberRequestDto.update requestDto) { this.password = requestDto.getPassword(); this.username = requestDto.getUsername(); this.mbti = requestDto.getMbti(); this.statusMessage = requestDto.getStatusMessage(); } public void uploadAvatar(String url) { this.avatar = url; } }
请问在上述update方法中,若requestDto的列值与实体原有值一致,是否会触发更新查询?
回答
这取决于JPA实现(以Hibernate为例)的配置和脏检查逻辑:
未配置
@DynamicUpdate时:
持久化上下文在flush阶段会对比实体当前值与加载时的快照值,即使属性值没有变化,Hibernate依然会生成包含所有列的UPDATE语句,只是数据库执行时因为值未发生实际变更,不会修改数据,但更新查询本身会被触发。配置了
@DynamicUpdate时:
Hibernate只会生成包含实际变化列的UPDATE语句。如果requestDto的所有列值都与实体原有值一致(通过equals判断,比如字符串内容相同、枚举为同一实例),则不会生成任何UPDATE语句,不会触发更新查询。
需要注意:你的update方法直接对属性赋值,不管值是否相同,但JPA的脏检查会基于值的实际对比结果来决定是否纳入更新,而非单纯看是否执行了赋值操作。
内容的提问来源于stack exchange,提问作者HEE-GEON
相关产品推荐
相关产品推荐

