原创

JPA实体类crud监听器以及审计功能

温馨提示:
本文最后更新于 2020年11月14日,已超过 1,220 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

什么是审计功能?

需要开启JPA的Audit审计功能@EnableJpaAuditing

数据库审计一般是指跟踪和记录与持久化实体相关的事件,或者仅仅是实体版本跟踪。

1.@CreatedBy、@CreatedDate…

开启了审计功能,就可以使用JPA提供的一些功能。

@Column(length = 32)
@CreatedBy
private String createBy;

@Column(length = 32)
@LastModifiedBy
private String updateBy;

@Column(nullable = false, updatable = false)
@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@CreatedDate
private LocalDateTime createTime;

@JsonFormat(locale = "zh", timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@LastModifiedDate
private LocalDateTime updateTime;

创建时间和更新时间会自动设置并插入数据库,但是createByupdateBy并没有赋值,因为需要实现AuditorAware接口来返回你需要插入的值。

@Component
public class SpringSecurityAuditorAware implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
        // 返回会话中或者指定的用户名
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication == null) {
            throw new CustomException(ResultStatus.UNAUTHORIZED, "当前登录状态过期");
        }
        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        return userDetails.getUsername();
    }
}

2.Crud前后

开启了审计功能,然后还有…可以做一些你想做的crud前后的事情…

e.g.我需要自己手段设置一些值的话…

/**
 * 实体类crud监听器
 *
 * @author Zhaopo Liu
 */
@Slf4j
@Component
public class EntityListener {

    /**
     * 新增操作之前
     * e.g.我需要自己手段设置一些值的话...
     *
     * @param target
     */
    @PrePersist
    public void PrePersist(Object target) {
        log.debug("新增操作之前...");
        Assert.notNull(target, "Entity must not be null!");
        if (target instanceof BaseEntity) {
            BaseEntity baseEntity = (BaseEntity) target;
            User user = SpringContextHolder.getBean(UserService.class).findByAccount(SecurityUtil.getCurrentUsername());
            if (user != null) {
                baseEntity.setCreateByName(user.getName());
                baseEntity.setUpdateByName(user.getName());
            }
        }
    }

    /**
     * 新增操作之后
     *
     * @param target
     */
    @PostPersist
    public void PostPersist(Object target) {
        log.debug("新增操作之后...");
    }

    /**
     * 更新操作之前
     *
     * @param target
     */
    @PreUpdate
    public void PreUpdate(Object target) {
        log.debug("更新操作之前...");
    }

    /**
     * 更新操作之后
     *
     * @param target
     */
    @PostUpdate
    public void PostUpdate(Object target) {
        log.debug("更新操作之后...");
    }

    /**
     * 删除操作之前
     *
     * @param target
     */
    @PreRemove
    public void PreRemove(Object target) {
        log.debug("删除操作之前...");
    }

    /**
     * 删除操作之后
     *
     * @param target
     */
    @PostRemove
    public void PostRemove(Object target) {
        log.debug("删除操作之后...");
    }

}

实体类使用:

@EntityListeners({AuditingEntityListener.class, EntityListener.class})
本文目录