中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • 如何利用SpringDataJPA開啟審計功能自動保存操作人操作時間

如何利用SpringDataJPA開啟審計功能自動保存操作人操作時間

發布時間:2021-12-21 13:22:32 來源:億速云 閱讀:235 作者:柒染 欄目:開發技術

今天就跟大家聊聊有關如何利用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表示默認為系統操作。

@Configuration
public 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如下

@Repository
public 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開啟審計功能自動保存操作人操作時間有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

四会市| 泽州县| 北票市| 鹤山市| 东源县| 葫芦岛市| 大港区| 城市| 泰州市| 洛浦县| 石阡县| 凤阳县| 禄丰县| 曲周县| 樟树市| 昆明市| 玛曲县| 巩义市| 博白县| 囊谦县| 青河县| 东乌珠穆沁旗| 呼玛县| 开平市| 应城市| 龙山县| 崇义县| 上犹县| 衡水市| 历史| 新兴县| 漳平市| 新和县| 北碚区| 双辽市| 久治县| 南乐县| 白朗县| 满城县| 龙山县| 海南省|