You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中如何用MapStruct映射请求对象并处理createdAt/updatedAt

解决MapStruct映射时createdAt/updatedAt字段的处理问题

你的做法其实是可行的,但结合JPA的回调机制,还有更简洁的实现方式,完全不需要手动处理这两个字段:

核心逻辑

你的BaseEntity已经通过@PrePersist和@PreUpdate注解实现了字段自动维护:

  • @PrePersist会在实体首次存入数据库时,自动把createdAt设为当前时间
  • @PreUpdate会在实体更新操作触发时,自动刷新updatedAt为当前时间

这两个字段的维护完全由JPA接管,MapStruct不需要参与任何映射操作。

优化后的UserMapper

因为UserRequest里根本没有createdAt和updatedAt属性,MapStruct默认会忽略源对象不存在对应属性的目标字段,所以你可以直接删掉这两行ignore配置,代码更简洁:

@Mapper(componentModel = "spring")
public interface UserMapper {

    @Mapping(target = "id", ignore = true)
    void updateRequestToUser(UserRequest request, @MappingTarget User user);
}

为什么不用手动加ignore?

MapStruct的映射规则是:只有源对象存在与目标字段同名的属性时,才会自动赋值。如果源对象没有对应属性,MapStruct不会修改目标字段的原有值——这正好契合我们的需求:

  • createdAt在更新操作中要保留创建时的原始值,不能被改动
  • updatedAt交给JPA的@PreUpdate自动更新,不需要MapStruct干预

额外提醒

id字段的ignore = true是必须保留的:更新操作中实体的ID应该由数据库或现有实例保持,不能被请求对象的ID覆盖(除非你有明确的业务需求,但通常更新时ID是从路径或上下文获取,不会从请求体传入)。

内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 09:43:01