我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何利用SpringDataJPA开启审计功能自动保存操作人操作时间

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何利用SpringDataJPA开启审计功能自动保存操作人操作时间

今天就跟大家聊聊有关如何利用SpringDataJPA开启审计功能自动保存操作人操作时间,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

有些业务数据对数据的创建、最后更新时间以及创建、最后操作人进行记录。如果使用Spring Data Jpa做数据新增或更新,可实现自动保存这些信息而不需要显示设置对应字段的值,可通过以下步骤进行配置。

1 相关注解

实现自动记录上述信息主要有5个注解

  • @EnableJpaAuditing:审计功能开关

  • @CreatedBy:标记数据创建者属性

  • @LastModifiedBy:标记数据最近一次修改者属性

  • @CreatedDate:标记数据创建日期属性

  • @LastModifiedDate:标记数据最近一次修改日期属性

2 实现过程

2.1 依赖引用

使用Spring Data JPA要引用依赖spring-boot-starter-data-jpa,gradle引用方式如下

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

2.2 实体类标记审计属性

案例使用User实体演示过程,需要在实体对应的字段上添加对应的注解表示是审计属性,另外需要在实体类上开启审计监听,如下:

@Entity@Table(name = "h_user")@EntityListeners({AuditingEntityListener.class})//开启审计监听public class User {    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Integer id;    //保存创建人的字段    @CreatedBy    @Column(name = "created_by")    private String createdBy;    //保存最近修改人的字段    @LastModifiedBy    @Column(name = "last_modified_by")    private String lastModifiedBy;    //保存创建时间的字段    @CreatedDate    @Column(name = "created_date")    //保存最近修改日期的字段    private Date createdDate;    @LastModifiedDate    @Column(name = "last_modified_date")    private Date lastModifiedDate;    private String realName;    private String username;    private String mobile;    private String email;    private String password;    private Integer flag;        public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getCreatedBy() {        return createdBy;    }    public void setCreatedBy(String createdBy) {        this.createdBy = createdBy;    }    public String getLastModifiedBy() {        return lastModifiedBy;    }    public void setLastModifiedBy(String lastModifiedBy) {        this.lastModifiedBy = lastModifiedBy;    }    public Date getCreatedDate() {        return createdDate;    }    public void setCreatedDate(Date createdDate) {        this.createdDate = createdDate;    }    public Date getLastModifiedDate() {        return lastModifiedDate;    }    public void setLastModifiedDate(Date lastModifiedDate) {        this.lastModifiedDate = lastModifiedDate;    }        public String getRealName() {        return this.realName;    }    public void setRealName(String realName) {        this.realName = realName;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getMobile() {        return mobile;    }    public void setMobile(String mobile) {        this.mobile = mobile;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }    @JsonIgnore    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public Integer getFlag() {        return flag;    }    public void setFlag(Integer flag) {        this.flag = flag;    }}

上述User实体对应数据表定义如下:

create table h_user( id int auto_increment primary key, username varchar(30) default '' not null comment '登录用户名', real_name varchar(30) default '' null comment '真实姓名', mobile varchar(25) default '' null comment '手机号码', email varchar(30) default '' null comment '邮箱', password varchar(100) default '' null comment '加密密码', flag int default '0' null comment '用户标记', created_by varchar(50) default 'HSystem' null comment '创建人', created_date datetime default CURRENT_TIMESTAMP not null, last_modified_by varchar(30) default 'HSystem' null comment '修改人', last_modified_date datetime default CURRENT_TIMESTAMP not null, constraint user_username_uindex unique (username))engine=InnoDB;

2.3 审计自定义操作

当对实体有新增或保存操作时,系统会自动获取操作时的系统时间作为创建时间和修改时间。

对于创建者或最后修改这,审计过程会获取当前登录系统的用户信息,当未登录的情况下,需要指定默认操作,可通过实现AuditorAware类来实现。

下面代码在未获取到用户信息时返回HSystem表示默认为系统操作。

@Configurationpublic class SpringSecurityAuditorAware implements AuditorAware<String> {    final Logger logger = LoggerFactory.getLogger(this.getClass());    @Override    public Optional<String> getCurrentAuditor() {        try {            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();            if (authentication instanceof AnonymousAuthenticationToken) {                return Optional.of("HSystem");            } else {                if (authentication == null) {                    return Optional.of("HSystem");                }                User user = (User) authentication.getPrincipal();                return Optional.of(user.getUsername());            }        } catch (Exception ex) {            logger.error("get user Authentication failed: " + ex.getMessage(), ex);            return Optional.of("HSystem");        }    }}

2.4 应用开启审计功能

在应用程序入口类添加注解@EnableJpaAuditing开启审计功能,如下

@SpringBootApplication//启用JPA审计功能,自动填充@CreateDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy注解的字段@EnableJpaAuditing(auditorAwareRef = "springSecurityAuditorAware")public class HBackendApplication {    public static void main(String[] args) {        SpringApplication.run(HBackendApplication.class, args);    }}

注意:如果系统中有多个审计实现,需要指定Bean的名称,上面案例中使用名称为springSecurityAuditorAware的bean。

2.5 实体操作

定义User实体类的JPA操作接口UserRepository如下

@Repositorypublic interface UserRepository extends PagingAndSortingRepository<User, Integer>, JpaRepository<User, Integer> {}

例如创建用户时代码如下,不需要显示设置上面提到的4个属性

User user = new User();user.setUsername(username.trim());user.setPassword(this.passwordEncoder.encode(password));user.setEmail("crane.liu@qq.com");user.setFlag(0);user.setMobile("18988888888");user.setRealName(username);this.userRepository.save(user);

当使用UserRepository对User类进行保存时,系统会自动记录数据的审计属性值。

最终效果如下:

如何利用SpringDataJPA开启审计功能自动保存操作人操作时间

看完上述内容,你们对如何利用SpringDataJPA开启审计功能自动保存操作人操作时间有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何利用SpringDataJPA开启审计功能自动保存操作人操作时间

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何利用SpringDataJPA开启审计功能自动保存操作人操作时间

今天就跟大家聊聊有关如何利用SpringDataJPA开启审计功能自动保存操作人操作时间,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。有些业务数据对数据的创建、最后更新时间以及创建、
2023-06-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录