spring boot 使用JPA @CreatedBy @LastModifiedBy 自动保存操作人

spring boot 使用JPA @CreatedBy @LastModifiedBy 自动保存操作人

在实际开发中,经常需要为数据保存创建人、创建时间、修改人、修改时间这样的数据。使用JPA能轻松搞定这个问题,为数据自动加上这些信息。因为时间比较简单,只要加上@CreatedDate 和 @LastModifiedDate 就行了,主要记录下@CreatedBy @LastModifiedBy这两个注解。

添加注解

在实体类对应的属性上面添加注解,如:
示例代码:

@EntityListeners(AuditingEntityListener.class)
@Data
public class BaseEntity {

    @Id
    @Column(length = 36, columnDefinition = "varchar(36) COMMENT '主键'")
    @GeneratedValue(generator="idGenerator")
    @GenericGenerator(name="idGenerator", strategy = "org.eking.labor.core.utils.SnowflakeId")
    private String uuid;

    @CreatedDate
    @Column(updatable = false, columnDefinition = "datetime COMMENT '创建时间'")
    private Date createTime;

    @LastModifiedDate
    @Column(columnDefinition = "datetime COMMENT '更新时间'")
    @JsonIgnore
    private Date updateTime;

    @Column(columnDefinition = "varchar(36) COMMENT '创建用户ID'")
    @CreatedBy
    @JsonIgnore
    private String createUserUuid;

    @Column(columnDefinition = "varchar(36) COMMENT '最后修改用户ID'")
    @LastModifiedBy
    @JsonIgnore
    private String lastModifyUserUuid;

    @Column(columnDefinition = "varchar(500) COMMENT '创建部门层级代码'")
    @JsonIgnore
    private String createDeptLevelCode;
}

实现AuditorAware类

需要实现org.springframework.data.domain.AuditorAware这个类,根据你需要返回的类型修改这个T,比如我需要返回的是字符串,就是String。需要注意的是,类需要加上@Component以便spring扫描到,否则不起作用。
示例代码:

@Component
@Slf4j
public class SpringSecurityAuditorAware implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        String userId = SecurityUtils.getCurrentUserId();
        if (userId != null){
            return Optional.of(userId);
        } else {
            return Optional.empty();
        }
    }
}

其中获取userId的方法是从spring security获取登录用户,这块就不赘述。

springboot 启动类加上注解@EnableJpaAuditing

加上注解后,会自动扫描到这个实现了AuditorAware的bean

@SpringBootApplication
@EnableJpaAuditing
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

如果有多个实现,则会报错找到两个实现类

No qualifying bean of type ‘org.springframework.data.domain.AuditorAware<?>’ available: expected single matching bean but found 2: springSecurityAuditorAware,springSecurityAuditorAwareTest

这时,只需要在EnableJpaAuditing注解后增加参数说明需要使用哪个就可以

@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

至此,在添加和修改数据库数据的时候,会自动保存当前登录用户的ID到数据库中。
在这里插入图片描述

<think>嗯,用户想了解Java中@CreatedBy注解在Spring Data JPA中的自动填充机制。首先,我需要回忆一下相关的知识点。记得@CreatedBy和类似的注解如@CreatedDate、@LastModifiedBy等是用来自动填充实体类的审计字段的。这些注解通常和JPA的审计功能一起使用,可能需要结合@EntityListeners和@EnableJpaAuditing来启用。 根据用户提供的引用内容,特别是引用[3]和引用[5],可以看到需要几个关键步骤。首先,实体类需要添加@EntityListeners(AuditingEntityListener.class)来启用审计监听。然后,在启动类上加上@EnableJpaAuditing开启整个应用的审计功能。此外,用户提到的公共类可能需要使用@MappedSuperclass注解,这样父类的字段才能被继承到子类的数据库表中,否则审计字段可能无法正确填充。 另外,@CreatedBy需要配合AuditorAware接口的实现类,这个实现类负责提供当前用户的信息。例如,在Spring Security环境中,可以通过SecurityContextHolder获取当前用户的用户名或ID,然后返回给AuditorAware,这样@CreatedBy就能自动填充这个值。引用[5]中的代码示例展示了如何实现AuditorAware,返回用户ID。 还要注意,如果实体类继承自一个父类,而这个父类包含审计字段,那么父类必须标注@MappedSuperclass,否则JPA可能不会处理这些字段,导致自动填充失效,如引用[3]所述的问题。此外,字段的类型需要正确,比如@CreatedBy通常用于String类型的用户标识,而@CreatedDate用于日期类型,可能需要使用@Temporal(TemporalType.TIMESTAMP)来指定日期格式。 用户可能遇到的问题包括未启用审计功能、未正确实现AuditorAware、或者父类没有正确使用@MappedSuperclass。需要检查这些配置是否正确,同时确保实体类正确继承了审计字段。 总结一下,回答的结构应该是先说明基本机制,然后分步骤讲解配置方法,接着说明如何获取用户信息,最后列举常见问题和解决方法。同时,引用相关的引用内容来支持每个步骤,确保回答的准确性。</think>### Java中@CreatedBy注解的自动填充机制详解 在Spring Data JPA中,`@CreatedBy` 是用于自动填充实体类审计字段(如创建者、修改者)的核心注解。其实现依赖于 **审计功能(Auditing)** 和 **用户信息注入机制**,以下是具体实现步骤与原理: --- #### 一、核心配置步骤 1. **启用JPA审计功能** 在Spring Boot启动类添加 `@EnableJpaAuditing` 注解,激活审计功能: ```java @SpringBootApplication @EnableJpaAuditing public class Application { ... } ``` 2. **实体类添加审计监听** 在实体类或公共基类上添加 `@EntityListeners(AuditingEntityListener.class)`,使JPA监听实体生命周期事件: ```java @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public abstract class BaseEntity { @CreatedBy private String createdBy; @LastModifiedBy private String modifiedBy; } ``` - `@MappedSuperclass` 确保基类字段映射到子类数据库表[^3]。 3. **实现用户信息注入** 自定义 `AuditorAware` 接口实现类,定义当前用户信息的获取逻辑: ```java @Component public class SpringSecurityAuditorAware implements AuditorAware<String> { @Override public Optional<String> getCurrentAuditor() { // 示例:从Spring Security中获取用户名 return Optional.ofNullable(SecurityContextHolder.getContext()) .map(SecurityContext::getAuthentication) .map(Authentication::getName); } } ``` - 此逻辑会为 `@CreatedBy` 和 `@LastModifiedBy` 提供值[^5]。 --- #### 二、注解作用范围与类型 - **适用字段类型** `@CreatedBy` 通常用于 `String` 类型字段,但也可支持自定义类型(如用户ID对象)。 - **触发时机** - `@CreatedBy`:仅在实体首次保存时填充。 - `@LastModifiedBy`:在实体插入和更新时均填充。 --- #### 三、常见问题与解决 1. **字段未自动填充** - 检查是否漏加 `@EnableJpaAuditing` 或 `@EntityListeners`。 - 确认基类是否标注 `@MappedSuperclass`。 2. **获取用户信息失败** - 确保 `AuditorAware` 实现类被Spring管理(如添加 `@Component`)。 - 在非Web请求线程中(如异步任务),需手动传递用户上下文。 3. **与时间注解结合使用** 若需同时填充时间字段,可添加 `@CreatedDate` 和 `@LastModifiedDate`: ```java @CreatedDate @Temporal(TemporalType.TIMESTAMP) private Date createTime; ``` --- #### 四、扩展应用 - **自定义ID生成策略** 若需使用雪花算法生成ID,可结合 `@GenericGenerator` 和 `@CreatedDate` 实现[^2]。 - **多租户场景** 通过重写 `AuditorAware`,可注入租户ID或其他业务上下文信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值