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

Spring Data JPA的Audit功能審計(jì)數(shù)據(jù)庫(kù)的變更

 更新時(shí)間:2021年06月26日 09:48:03   作者:南瓜慢說  
數(shù)據(jù)庫(kù)審計(jì)是指當(dāng)數(shù)據(jù)庫(kù)有記錄變更時(shí),可以記錄數(shù)據(jù)庫(kù)的變更時(shí)間和變更人等,這樣以后出問題回溯問責(zé)也比較方便,本文討論Spring Data JPA審計(jì)數(shù)據(jù)庫(kù)變更問題,感興趣的朋友一起看看吧

我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!

1 數(shù)據(jù)庫(kù)審計(jì)

數(shù)據(jù)庫(kù)審計(jì)是指當(dāng)數(shù)據(jù)庫(kù)有記錄變更時(shí),可以記錄數(shù)據(jù)庫(kù)的變更時(shí)間和變更人等,這樣以后出問題回溯問責(zé)也比較方便。對(duì)于審計(jì)表記錄的變更可以兩種方式,一種是建立一張審計(jì)表專門用于記錄,另一種是在數(shù)據(jù)庫(kù)增加字段。本文所討論的是第二種方案。

那如何在新增、修改、刪除的時(shí)候同時(shí)增加記錄呢?如果每張表都單獨(dú)記錄,代碼就會(huì)顯得很冗余。更好的方式應(yīng)該是做切面或者事件監(jiān)聽,當(dāng)數(shù)據(jù)有變更時(shí)統(tǒng)一進(jìn)行記錄。

2 Spring Data JPA審計(jì)

Spring Data JPA為我們提供了方便的Audit功能,通過四個(gè)注解來標(biāo)記字段:

(1) @CreatedBy: 創(chuàng)建人

(2) @CreatedDate: 創(chuàng)建時(shí)間

(3) @LastModifiedBy: 最后修改人

(4) @LastModifiedDate: 最后修改時(shí)間

接下來我們來看看怎么使用。

2.1 項(xiàng)目準(zhǔn)備

通過Docker啟動(dòng)PostgreSQL數(shù)據(jù)庫(kù):

docker run -itd \
    --name pkslow-postgres \
    -e POSTGRES_DB=pkslow \
    -e POSTGRES_USER=pkslow \
    -e POSTGRES_PASSWORD=pkslow \
    -e PGDATA=/var/lib/postgresql/data/pgdata \
    -p 5432:5432 \
    postgres:10

引入相關(guān)依賴:

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

Spring Security不是必須的,這里使用它來獲取用戶名。配置的用戶為:

spring.security.user.name=pkslow
spring.security.user.password=123456

2.2 創(chuàng)建實(shí)體父類

其實(shí)父類不是必須的,你可以在每個(gè)想Audit的實(shí)體類進(jìn)行配置,但比較麻煩,不如創(chuàng)建一個(gè)父類,再讓想審計(jì)的子類都繼承它:

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Auditable<U> {
    @CreatedBy
    @Column(name = "created_by")
    private U createdBy;

    @CreatedDate
    @Column(name = "created_date")
    private Date createdDate;

    @LastModifiedBy
    @Column(name = "last_modified_by")
    private U lastModifiedBy;

    @LastModifiedDate
    @Column(name = "last_modified_date")
    private Date lastModifiedDate;
  // getter
  //setter
}

@MappedSuperclass可以讓其它子實(shí)體類繼承相關(guān)的字段和屬性;

@EntityListeners設(shè)置監(jiān)聽類,會(huì)對(duì)新增修改進(jìn)行回調(diào)處理。

有了父類之后,子類就簡(jiǎn)單了:

@Entity
@Table(name = "pkslow_users")
public class User extends Auditable<String> {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;
    private String name;
    private String email;
    private String country;
    private String website;
  //getter setter
}

2.3 如何獲取名字

數(shù)據(jù)總是被修改的,我們要提供一個(gè)獲取修改人名字的接口,配置如下:

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class JpaAuditingConfiguration {

    @Bean
    public AuditorAware<String> auditorProvider() {
        return () -> {
            String username = "system";
            SecurityContext context = SecurityContextHolder.getContext();
            if (context != null) {
                Authentication authentication = context.getAuthentication();
                if (authentication != null) {
                    username = authentication.getName();
                }
            }

            String result = username;
            return Optional.ofNullable(result);
        };
    }
}

這里配置的是通過Spring SecurityContext來獲取登陸用戶的名字,當(dāng)然可以有其它方案,如獲取請(qǐng)求頭的某個(gè)字段等。

注意注解@EnableJpaAuditing開啟了審計(jì)功能。

2.4 測(cè)試

我們通過一個(gè)Controller來新增數(shù)據(jù),看看會(huì)有什么效果:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserRepository userRepository;
    @PostMapping
    public User save(@RequestBody User user) {
        return userRepository.save(user);
    }
}

通過curl命令來測(cè)試如下:

$ curl 'http://localhost:8088/user' -X POST \
> -H 'Content-Type: application/json' \
> -H 'Authorization:Basic cGtzbG93OjEyMzQ1Ng==' \
> -d '{
>     "name":"larry",
>     "email":"admin@pkslow.com",
>     "country":"China",
>     "website":"www.pkslow.com"
> }'
{"createdBy":"pkslow","createdDate":"2021-01-15T15:08:47.035+0000","lastModifiedBy":"pkslow","lastModifiedDate":"2021-01-15T15:08:47.035+0000","userId":7,"name":"larry","email":"admin@pkslow.com","country":"China","website":www.pkslow.com}

查看數(shù)據(jù)庫(kù),已經(jīng)生成了審計(jì)記錄:

3 總結(jié)

代碼請(qǐng)查看:https://github.com/LarryDpk/pkslow-samples

到此這篇關(guān)于Spring Data JPA的Audit功能審計(jì)數(shù)據(jù)庫(kù)的變更的文章就介紹到這了,更多相關(guān)Spring Data JPA審計(jì)數(shù)據(jù)庫(kù)變更內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Springboot2.0構(gòu)建ES的多客戶端

    基于Springboot2.0構(gòu)建ES的多客戶端

    這篇文章主要為大家詳細(xì)介紹了基于Springboot2.0構(gòu)建ES的多客戶端,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java中MyBatis傳入?yún)?shù)parameterType問題

    Java中MyBatis傳入?yún)?shù)parameterType問題

    這篇文章主要介紹了Java中MyBatis傳入?yún)?shù)parameterType問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java中wait與sleep的區(qū)別講解(wait有參及無(wú)參區(qū)別)

    Java中wait與sleep的區(qū)別講解(wait有參及無(wú)參區(qū)別)

    這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無(wú)參區(qū)別),通過代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下
    2022-04-04
  • Java 實(shí)戰(zhàn)項(xiàng)目之教材管理系統(tǒng)的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目之教材管理系統(tǒng)的實(shí)現(xiàn)流程

    讀萬(wàn)卷書不如行萬(wàn)里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+SSM+jsp+mysql+maven實(shí)現(xiàn)教材管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 詳解spring boot實(shí)現(xiàn)websocket

    詳解spring boot實(shí)現(xiàn)websocket

    這篇文章主要介紹了詳解spring boot實(shí)現(xiàn)websocket,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • logback輸出日志屏蔽quartz的debug等級(jí)日志方式

    logback輸出日志屏蔽quartz的debug等級(jí)日志方式

    這篇文章主要介紹了logback輸出日志屏蔽quartz的debug等級(jí)日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java源碼解析之GenericDeclaration詳解

    Java源碼解析之GenericDeclaration詳解

    這篇文章主要介紹了Java源碼解析之GenericDeclaration詳解。有句古話說得好,源碼能使人快樂!這里分享給大家,供需要的朋友參考。
    2017-10-10
  • java文字轉(zhuǎn)語(yǔ)音的實(shí)現(xiàn)示例

    java文字轉(zhuǎn)語(yǔ)音的實(shí)現(xiàn)示例

    在Java中,我們可以使用第三方庫(kù)來實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音的功能,本文主要介紹了java文字轉(zhuǎn)語(yǔ)音的實(shí)現(xiàn)示例,選擇jacob技術(shù)實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • java中ExecutorService創(chuàng)建方法總結(jié)

    java中ExecutorService創(chuàng)建方法總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于java中ExecutorService創(chuàng)建方法總結(jié),有興趣的朋友們可以參考下。
    2021-01-01
  • 深入理解Java main方法詳解

    深入理解Java main方法詳解

    這篇文章主要為大家介紹了Java main方法詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11

最新評(píng)論

榆树市| 大宁县| 平凉市| 隆林| 梁河县| 铜梁县| 鄂托克旗| 馆陶县| 九龙县| 南康市| 陈巴尔虎旗| 麦盖提县| 邵武市| 北京市| 石门县| 绥中县| 宝丰县| 三河市| 南昌县| 宜宾市| 延边| 建瓯市| 平远县| 崇文区| 河津市| 舒兰市| 肇东市| 湖北省| 那曲县| 屏东市| 石渠县| 甘孜县| 宜宾县| 合江县| 渑池县| 林周县| 台山市| 阳新县| 沂水县| 应城市| 勃利县|