使用 JPA 和 Hibernate 定义一个基础实体(创建时间,创建人,更新时间,更新人)

发布时间 2023-03-22 21:11:07作者: 代码红了一大片

首先确定使用的是 JPA + Hibernate. 导入对应依赖(省略)。

使用的场景,在数据库中,每个表都需要的字段,(创建时间,创建人,更新时间,更新人) ,减少我们频繁重复的工作。


1、创建对应的基础类
import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Data;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * 基础实体
 **/
@Data
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class AbstractEntity implements Serializable {
    @CreatedBy
    @Column(name = "created_by", updatable = false)
    private String createdBy;

    @CreatedDate
    @Column(name = "created_at", updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedBy
    @Column(name = "updated_by")
    private String updatedBy;

    @LastModifiedDate
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
}
  • 其中@MappedSuperclass :表示当前的类是一个基础的父类,不会生成对应的实体(@Entity 是需要对应的实体的)
  • @EntityListeners(AuditingEntityListener.class) 是实体类的一个监听器,使用这个后,才会监听到实体类的变化。进行时间戳和对应的创建人更新人的添加。
  • @CreatedBy、@CreatedDate、 @LastModifiedBy、@LastModifiedDate 注解的直译就是对应的意思,很好理解,不做赘述。

完成对应的上述操作后,并不会起作用,接下来,完成第二步

2、使用 @EnableJpaAuditing 在Spring应用程序的配置类中启用JPA审计功能,添加此功能后@CreatedDate和@LastModifiedDate注解就会生效
@SpringBootApplication
@EnableJpaAuditing
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
但是我们使用的@CreatedBy,@LastModifiedBy还没有起作用,还需要做一个配置类
@Configuration
public class UserAuditorAware implements AuditorAware {
    @Override
    public Optional<String> getCurrentAuditor() {
        final String userId = "当前用户名称,可以从上下文获取";
        if (StringUtils.isNotBlank(userId)) {
            return Optional.ofNullable(userId);
        }
        return Optional.empty();
    }
}

完成上述的操作之后,我们的基础实体类就配置完成了,其他的实体类(包含@Entity的类)就可以继承实现自动添加更新对应的字段了