使用 JPA 和 Hibernate 定义一个基础实体(创建时间,创建人,更新时间,更新人)
首先确定使用的是 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的类)就可以继承实现自动添加更新对应的字段了