Spring Data JPA 实战 - Auditing与@MappedSuperclass

在Spring Data JPA中,Auditing(审计)是一种非常实用的功能,它可以帮助我们自动记录实体对象的创建时间和修改时间,以及创建人和最后修改人的信息。而@MappedSuperclass注解则用于定义一个基类,这个基类包含了一些通用的属性和行为,可以被多个实体类继承。

下面我将详细介绍如何结合@MappedSuperclass和Spring Data JPA的Auditing功能来实现实体的审计功能。

1. 添加依赖

首先确保你的项目中有Spring Data JPA和Spring Boot Starter Web的依赖。如果你使用的是Maven,可以添加以下依赖到pom.xml文件中:

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

2. 配置Auditing

在Spring Boot应用中,你需要配置一个AuditAware实现来告诉Spring Data JPA如何获取当前登录用户的信息。

创建一个AuditAwareImpl类来实现AuditAware接口:

import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class AuditAwareImpl implements AuditAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        if (principal instanceof UserDetails) {
            return Optional.of(((UserDetails) principal).getUsername());
        } else if (principal instanceof String) {
            return Optional.of((String) principal);
        }

        return Optional.empty();
    }
}

这个实现类会从Spring Security的安全上下文中获取当前登录的用户信息。如果你的应用没有使用Spring Security,可以根据实际情况进行调整。

3. 创建Audit基类

接下来,定义一个AuditBase类,使用@MappedSuperclass注解,这样就可以被其他实体类继承。

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.time.LocalDateTime;

@MappedSuperclass
public abstract class AuditBase {

    @Column(nullable = false, updatable = false)
    private LocalDateTime createdDate;

    @Column(nullable = false)
    private LocalDateTime lastModifiedDate;

    @Column(updatable = false)
    private String createdBy;

    @Column
    private String lastModifiedBy;

    @PrePersist
    protected void onCreate() {
        createdDate = LocalDateTime.now();
        lastModifiedDate = createdDate;
        createdBy = getCurrentAuditor();
        lastModifiedBy = createdBy;
    }

    @PreUpdate
    protected void onUpdate() {
        lastModifiedDate = LocalDateTime.now();
        lastModifiedBy = getCurrentAuditor();
    }

    // Getter methods for the fields
}

在这个基类中,我们定义了创建时间和最后修改时间的字段,以及创建者和最后修改者的字段。同时,我们还实现了@PrePersist@PreUpdate注解来确保这些字段在实体保存或更新之前能够被正确地设置。

4. 使用Audit基类

现在,你可以让任何需要审计功能的实体类继承AuditBase类。

例如,创建一个User实体类:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User extends AuditBase {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private String email;

    // Getters and setters
}

5. 启用Auditing

最后,确保你的Application类中启用了Auditing功能,可以通过@EnableJpaAuditing注解来实现。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "auditAwareImpl")
public class Application {

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

这里的auditorAwareRef属性指定了我们之前创建的AuditAwareImpl实现类。

总结

通过以上步骤,我们已经成功地配置了一个具有审计功能的Spring Data JPA应用程序。每当实体被保存或更新时,Spring Data JPA都会自动填充创建时间和最后修改时间等信息,极大地简化了开发工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值