Spring Data审计功能@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy的使用

本文介绍如何在SpringBoot项目中利用SpringJPA实现自动审计日志功能,通过添加特定注解实现创建时间和修改时间等字段的自动填充。

在Spring JPA中,在实体bean的属性上加注解@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy,可以再实体插入数据库时进行设置值,这样以来,在对普通实体类的添加、修改操作时,就不用关心创建时间、更新时间这些信息了。本文以SpringBoot为例

1、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

2、实体bean

注意:

2.1、@MappedSuperclass需要添加,因为一般这种domain类都是需要被继承的,为了在子类对象中能取到父类对象的属性,所以必须得加上;

2.2、@Audited:开启domain对象的审计功能

2.3、@EntityListeners(AuditingEntityListener.class):需要开启domain对象的监听,否则无法监测到对象的修改

@MappedSuperclass
@Audited
@EntityListeners(AuditingEntityListener.class)
public abstract class AbstractEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @CreatedBy
    @Column(name = "created_by", nullable = false, length = 32, updatable = false)
    @JsonIgnore
    private String createdBy;

    @CreatedDate
    @Column(name = "created_date", nullable = false)
    @JsonIgnore
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private ZonedDateTime createdDate = ZonedDateTime.now();

    @LastModifiedBy
    @Column(name = "modified_by", nullable = false, length = 32)
    @JsonIgnore
    private String modifiedBy;

    @LastModifiedDate
    @Column(name = "modified_date")
    @JsonIgnore
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private ZonedDateTime modifiedDate = ZonedDateTime.now();

    // 省略对应的 set/get 方法......
}

3、实现AuditorAware接口

@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
        //返回会话中或者指定的用户名
        //自己去处理获取用户名.
        return SecurityUtils.getCurrentUsername();
    }

}

4、启用JPA Audit注解@EnableJpaAuditing(xxxApplication.java也就是项目的启动类中)

@Slf4j
@SpringBootApplication
//1、这种是全部开启
//@EnableJpaAuditing
//2、这种是指定开启
@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")
public class ItmsApplication {

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

}

 

<think>我们正在讨论的是Spring框架中的`@CreatedDate`注解。根据引用[1]和引用[4],`@CreatedDate`注解用于自动记录实体创建的时间戳。在Spring Data JPA和Spring Data MongoDB中,该注解可以标记在实体类的字段上,当实体被首次保存时,框架会自动将当前日期时间注入到该字段中。 引用[1]提到:“关于时间的生成注解@CreatedDate@LastModifiedDate使用”,并提到这些注解为开发省去了不少功夫。引用[4]则具体说明了在MongoDB中`@CreatedDate`的用法,它表示该字段为文档的创建日期字段,会自动填充插入文档时的日期。 因此,我们可以总结如下: ### 作用 `@CreatedDate`注解的主要作用是自动记录实体被创建的时间点。它通常用于审计目的,例如跟踪记录的创建时间。 ### 使用场景 1. **数据库审计**:自动记录数据的创建时间,无需手动设置。 2. **版本控制**:结合`@LastModifiedDate`,可以追踪实体的创建和修改时间。 3. **数据同步**:在分布式系统中,通过时间戳判断数据的新鲜度。 ### 使用方法(以Spring Data JPA为例) 1. **在实体类中标注字段**:使用`@CreatedDate`注解标记一个日期/时间类型的字段。 2. **启用JPA审计**:在配置类上添加`@EnableJpaAuditing`注解以启用审计功能。 3. **实体类实现审计接口**:实体类通常需要实现`Auditable`接口或使用`@EntityListeners(AuditingEntityListener.class)`来监听实体持久化事件。 #### 示例代码 ```java import org.springframework.data.annotation.CreatedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.*; import java.util.Date; @Entity @EntityListeners(AuditingEntityListener.class) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @CreatedDate @Temporal(TemporalType.TIMESTAMP) // 指定日期时间精度 private Date createdAt; // 创建时间 // 省略getter和setter } ``` #### 配置类 ```java import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @Configuration @EnableJpaAuditing public class JpaConfig { } ``` ### 注意事项 1. **日期类型**:在JPA中,日期字段需要使用`@Temporal`注解指定类型(如`TemporalType.TIMESTAMP`)。如果使用Java 8的日期时间类型(如`LocalDateTime`),则不需要`@Temporal`注解。 2. **自动填充**:只有在实体首次被保存时,`@CreatedDate`才会被填充。后续更新不会改变该字段。 3. **与`@LastModifiedDate`配合**:通常,我们还会同时使用`@LastModifiedDate`来记录最后一次修改的时间。 ### 在MongoDB中的使用 引用[4]展示了在Spring Data MongoDB中的使用: ```java public class Test { @CreatedDate private Long createdAt; // 可以使用Long类型表示时间戳 @CreatedDate private Date createdDate; // 也可以使用Date类型 } ``` 在MongoDB中,同样需要启用审计功能,通过`@EnableMongoAuditing`注解。 ### 总结 `@CreatedDate`是Spring Data提供的一个便捷注解,用于自动化填充实体的创建时间,大大简化了开发工作[^1][^4]。 §§相关问题§§ 1. `@LastModifiedDate`注解与`@CreatedDate`有何区别? 2. 如何在Spring Boot中同时启用JPA和MongoDB的审计功能? 3. 如何自定义审计字段的值(例如使用其他时间源)? 4. 审计功能在分布式系统中如何保证时间一致性? 5. 除了时间审计Spring Data还支持哪些审计功能?</think>在 Spring 框架中,`@CreatedDate` 注解是一个用于**自动记录实体创建时间**的审计注解,它属于 Spring Data 项目的一部分。以下是详细说明: ### 一、核心作用 1. **自动填充创建时间** 当实体首次保存到数据库时,自动将**当前时间戳**注入到标记字段 2. **审计追踪** 记录数据的创建时间点,满足审计需求 3. **减少样板代码** 无需手动设置创建时间,提高开发效率 ### 二、使用场景 1. 用户注册时间记录 2. 订单创建时间追踪 3. 内容发布时的时间戳 4. 需要审计数据的业务系统 5. 需要版本控制的实体(配合`@LastModifiedDate`) ### 三、使用方法(以 Spring Data JPA 为例) #### 步骤 1:实体类配置 ```java import org.springframework.data.annotation.CreatedDate; import javax.persistence.*; import java.time.LocalDateTime; @Entity @EntityListeners(AuditingEntityListener.class) // 关键监听器 public class User { @Id @GeneratedValue private Long id; private String name; @CreatedDate private LocalDateTime createdAt; // 自动记录创建时间 // 其他字段... } ``` #### 步骤 2:启用审计功能 在配置类添加注解: ```java @Configuration @EnableJpaAuditing // 启用JPA审计 public class JpaConfig { } ``` #### 步骤 3:保存实体(自动填充) ```java // 创建时不设置时间 User user = new User("John"); userRepository.save(user); // 保存后自动填充时间 System.out.println(user.getCreatedAt()); // 输出:2023-10-10T14:30:45.123 ``` ### 四、支持的数据类型 1. `java.time.LocalDateTime`(推荐) 2. `java.time.LocalDate` 3. `java.util.Date` 4. `java.time.Instant` 5. `Long`(时间戳) ### 五、与其他注解配合使用 | 注解 | 作用 | 示例 | |------|------|------| | `@LastModifiedDate` | 记录最后修改时间 | `@LastModifiedDate private LocalDateTime updatedAt;` | | `@CreatedBy` | 记录创建者 | `@CreatedBy private String createdBy;` | | `@Version` | 乐观锁控制 | `@Version private Long version;` | ### 六、注意事项 1. **必须启用审计** 确保配置类有`@EnableJpaAuditing`(JPA)或`@EnableMongoAuditing`(MongoDB)[^1][^4] 2. **需要监听器** 实体类需添加`@EntityListeners(AuditingEntityListener.class)` 3. **仅首次保存触发** 只在实体第一次持久化时填充,后续更新不修改 4. **时区处理** 建议使用`LocalDateTime`避免时区问题(默认使用系统时区) > 提示:在 MongoDB 中使用方式类似,只需将`@Entity`换成`@Document`,并启用`@EnableMongoAuditing`[^4]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值