最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年12月21日 11:26:54   作者:晴空排云  
這篇文章主要介紹了利用SpringDataJPA開啟審計功能,自動保存操作人操作時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

有些業(yè)務(wù)數(shù)據(jù)對數(shù)據(jù)的創(chuàng)建、最后更新時間以及創(chuàng)建、最后操作人進(jìn)行記錄。如果使用Spring Data Jpa做數(shù)據(jù)新增或更新,可實(shí)現(xiàn)自動保存這些信息而不需要顯示設(shè)置對應(yīng)字段的值,可通過以下步驟進(jìn)行配置。

1 相關(guān)注解

實(shí)現(xiàn)自動記錄上述信息主要有5個注解

  • @EnableJpaAuditing:審計功能開關(guān)
  • @CreatedBy:標(biāo)記數(shù)據(jù)創(chuàng)建者屬性
  • @LastModifiedBy:標(biāo)記數(shù)據(jù)最近一次修改者屬性
  • @CreatedDate:標(biāo)記數(shù)據(jù)創(chuàng)建日期屬性
  • @LastModifiedDate:標(biāo)記數(shù)據(jù)最近一次修改日期屬性

2 實(shí)現(xiàn)過程

2.1 依賴引用

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

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

2.2 實(shí)體類標(biāo)記審計屬性

案例使用User實(shí)體演示過程,需要在實(shí)體對應(yīng)的字段上添加對應(yīng)的注解表示是審計屬性,另外需要在實(shí)體類上開啟審計監(jiān)聽,如下:

@Entity
@Table(name = "h_user")
@EntityListeners({AuditingEntityListener.class})//開啟審計監(jiān)聽
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    //保存創(chuàng)建人的字段
    @CreatedBy
    @Column(name = "created_by")
    private String createdBy;
    //保存最近修改人的字段
    @LastModifiedBy
    @Column(name = "last_modified_by")
    private String lastModifiedBy;
    //保存創(chuàng)建時間的字段
    @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實(shí)體對應(yīng)數(shù)據(jù)表定義如下:

create table h_user
(
 id int auto_increment primary key,
 username varchar(30) default '' not null comment '登錄用戶名',
 real_name varchar(30) default '' null comment '真實(shí)姓名',
 mobile varchar(25) default '' null comment '手機(jī)號碼',
 email varchar(30) default '' null comment '郵箱',
 password varchar(100) default '' null comment '加密密碼',
 flag int default '0' null comment '用戶標(biāo)記',
 created_by varchar(50) default 'HSystem' null comment '創(chuàng)建人',
 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 審計自定義操作

當(dāng)對實(shí)體有新增或保存操作時,系統(tǒng)會自動獲取操作時的系統(tǒng)時間作為創(chuàng)建時間和修改時間。

對于創(chuàng)建者或最后修改這,審計過程會獲取當(dāng)前登錄系統(tǒng)的用戶信息,當(dāng)未登錄的情況下,需要指定默認(rèn)操作,可通過實(shí)現(xiàn)AuditorAware類來實(shí)現(xiàn)。

下面代碼在未獲取到用戶信息時返回HSystem表示默認(rèn)為系統(tǒng)操作。

@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 應(yīng)用開啟審計功能

在應(yīng)用程序入口類添加注解@EnableJpaAuditing開啟審計功能,如下

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

注意:如果系統(tǒng)中有多個審計實(shí)現(xiàn),需要指定Bean的名稱,上面案例中使用名稱為springSecurityAuditorAware的bean。

2.5 實(shí)體操作

定義User實(shí)體類的JPA操作接口UserRepository如下

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

例如創(chuàng)建用戶時代碼如下,不需要顯示設(shè)置上面提到的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);

當(dāng)使用UserRepository對User類進(jìn)行保存時,系統(tǒng)會自動記錄數(shù)據(jù)的審計屬性值。

最終效果如下:

在這里插入圖片描述

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Java如何優(yōu)雅的實(shí)現(xiàn)字典翻譯

    詳解Java如何優(yōu)雅的實(shí)現(xiàn)字典翻譯

    當(dāng)我們在Java應(yīng)用程序中需要對字典屬性進(jìn)行轉(zhuǎn)換返回給前端時,如何簡單、方便、并且優(yōu)雅的處理是一個重要問題。在本文中,我們將介紹如何使用Java中的序列化機(jī)制來優(yōu)雅地實(shí)現(xiàn)字典值的翻譯,從而簡化開發(fā)
    2023-04-04
  • springboot下實(shí)現(xiàn)RedisTemplate?List?清空

    springboot下實(shí)現(xiàn)RedisTemplate?List?清空

    我們經(jīng)常會使用Redis的List數(shù)據(jù)結(jié)構(gòu)來存儲一系列的元素,當(dāng)我們需要清空一個List時,可以使用RedisTemplate來實(shí)現(xiàn),本文就來詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • Java實(shí)現(xiàn)屏幕截圖工具的代碼分享

    Java實(shí)現(xiàn)屏幕截圖工具的代碼分享

    這篇文章主要為大家介紹了如何利用Java語言編寫一個電腦屏幕截圖工具,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-05-05
  • Java后端調(diào)用微信支付和支付寶支付的詳細(xì)步驟

    Java后端調(diào)用微信支付和支付寶支付的詳細(xì)步驟

    這篇文章主要介紹了Java后端如何調(diào)用微信支付和支付寶支付,涵蓋了基本概念、配置步驟、代碼示例以及注意事項,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • Eclipse配置springIDE插件的方法步驟

    Eclipse配置springIDE插件的方法步驟

    本篇文章主要介紹了Eclipse配置springIDE插件的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • java后端返回數(shù)據(jù)給前端時去除值為空或NULL的屬性、忽略某些屬性代碼示例

    java后端返回數(shù)據(jù)給前端時去除值為空或NULL的屬性、忽略某些屬性代碼示例

    在Java開發(fā)中我們處理JSON數(shù)據(jù)時經(jīng)常會遇到空值(null)的情況,這篇文章主要給大家介紹了關(guān)于java后端返回數(shù)據(jù)給前端時去除值為空或NULL的屬性、忽略某些屬性的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Spring Security基本原理詳解

    Spring Security基本原理詳解

    這篇文章主要介紹了Spring Security基本原理詳解,springsecurity底層實(shí)現(xiàn)為一條過濾器鏈,就是用戶請求進(jìn)來,判斷有沒有請求的權(quán)限,拋出異常,重定向跳轉(zhuǎn),需要的朋友可以參考下
    2023-05-05
  • Java使用設(shè)計模式中的工廠方法模式實(shí)例解析

    Java使用設(shè)計模式中的工廠方法模式實(shí)例解析

    當(dāng)系統(tǒng)準(zhǔn)備為用戶提供某個類的子類的實(shí)例,又不想讓用戶代碼和該子類形成耦合時,就可以使用工廠方法模式來設(shè)計系統(tǒng).工廠方法模式的關(guān)鍵是在一個接口或抽象類中定義一個抽象方法,下面我們會具體介紹Java使用設(shè)計模式中的工廠方法模式實(shí)例解析.
    2016-05-05
  • 淺析java 10中的var關(guān)鍵字用法

    淺析java 10中的var關(guān)鍵字用法

    2018年3月20日,Oracle發(fā)布java10。java10為java帶來了很多新特性。這篇文章主要介紹了Java 10 var關(guān)鍵字詳解和示例教程,需要的朋友可以參考下
    2018-10-10
  • springboot的LogbackLoggingSystem配置加載流程解析

    springboot的LogbackLoggingSystem配置加載流程解析

    這篇文章主要介紹了springboot的LogbackLoggingSystem配置加載流程源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11

最新評論

义乌市| 日土县| 延津县| 绵阳市| 若尔盖县| 海伦市| 营山县| 马边| 延津县| 遵义市| 包头市| 黔西| 福泉市| 南漳县| 沁水县| 垦利县| 泰来县| 呼图壁县| 贵定县| 舒城县| 九台市| 临汾市| 永嘉县| 霍林郭勒市| 兴城市| 临清市| 丹巴县| 连山| 准格尔旗| 巴林右旗| 湟源县| 平阴县| 辽阳市| 浦东新区| 象山县| 信宜市| 永胜县| 丰顺县| 黑山县| 贡嘎县| 开阳县|