springboot 中用注解生成审计(Auditing)字段。如:@LastModifiedBy

本文介绍如何在SpringBoot项目中利用Spring Data JPA实现自动审计日志功能,包括创建时间、创建人、最后修改时间和最后修改人的自动记录。通过使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy等注解,结合实体监听器和AuditorAware接口,简化了代码并提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在spring jpa中,支持在字段或者方法上进行注解@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy。维护数据库的创建时间、创建人、最后修改时间、最后修改人。实现步骤如下:

一、在需要的实体上做下面的改造。

  • 在实体类上使用注解。@EntityListeners。
  • 在响应的字段属性上加注解。如:@LastModifiedDate
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
	private static final long serialVersionUID = 7491626901163891174L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@JsonIgnore
	@Temporal(TemporalType.TIMESTAMP)
	@CreatedDate
	@Column(updatable = false)
	private Date createTime;

	@JsonIgnore
	@Temporal(TemporalType.TIMESTAMP)
	@LastModifiedDate
	@Column(updatable = false)
	private Date updateTime;

	@LastModifiedBy
	private String updatedBy;
	//省略getter、setter

二、增加AuditorAware实现类。用于获取创建人、最后修改人。

@Component("auditorAware")
public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        return Optional.of(authentication.getPrincipal().toString());
    }
}

三、在springbooot入口类上配置@EnableJpaAuditing。

@SpringBootApplication
@EnableCaching(proxyTargetClass = true)
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class TestApplication {
}

其中的auditorAwareRef = "auditorAware"就是上面配置的@Component("auditorAware")

转载于:https://my.oschina.net/kunBlog/blog/3011886

<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、付费专栏及课程。

余额充值