🤗

Spring Data JPAで監査情報を自動管理する

に公開

概要

エンティティクラスにはデータの作成・修正することを管理するためのフィールドを用意することが多いです。
一般的によく使われるフィールドとしては、以下のようなものがあります:

  • 作成者
  • 作成日時
  • 更新者
  • 更新日時

これらのフィールドは、エンティティを新規作成または更新するたびに、毎回値を設定する必要があり、手間がかかります。

エンティティ例)

Member.class

@Entity
public class Member {

    @Column
    private LocalDateTime createdAt;
    @Column
    private String createdBy;
    @Column
    private LocalDateTime modifiedAt;
    @Column
    private String modifiedBy;

    // ...

}

そのため、Spring Data JPA では
これらの値を自動的に設定してくれる機能を提供しています。

実装例

1. 作成日・作成者を管理するベースエンティティの作成

作成日時作成者 を自動で記録するための共通クラス BaseEntity を作成します。
このクラスを継承することで、各エンティティにおける監査情報の管理を統一できます。

BaseEntity.java
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;
}

✅ アノテーション

アノテーション 役割
@MappedSuperclass 共通フィールドを継承先で再利用するための基底クラスに指定する
@EntityListeners(AuditingEntityListener.class) 監査処理(作成・更新時の自動値設定)を有効化する
@CreatedDate 作成日時を自動で記録する
@CreatedBy 作成者(ユーザー)を自動で記録する
@Column(updatable = false) 一度設定された値が変更されないように制御する

2. 更新日・更新者を管理するベースエンティティの作成

更新日時更新者 を管理するための共通クラス MutableBaseEntity を作成します。
このクラスは、前の BaseEntity を継承し、更新監査情報のフィールドを追加した構成です。

MutableBaseEntity.java
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class MutableBaseEntity extends BaseEntity {

    @LastModifiedDate
    @Column(updatable = true)
    private LocalDateTime modifiedAt;

    @LastModifiedBy
    @Column(updatable = true)
    private String modifiedBy;
}

✅ アノテーション

アノテーション 役割
@LastModifiedDate 最終更新日時を自動で記録する
@LastModifiedBy 最終更新者(ユーザー)を自動で記録する
@Column(updatable = true) 設定された値を変更可能にする

3. @EnableJpaAuditing の設定

Spring Data JPA の監査機能を有効にするには、 アプリケーションに
@EnableJpaAuditing アノテーションを付ける必要があります。

小規模なプロジェクトなどでは、以下のように @SpringBootApplication を付与しているメインクラスに直接記述しても問題ありません。

MyApplication.java
@EnableJpaAuditing
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

監査機能の設定をアプリケーションの起動クラスとは分離して管理したい場合は、
専用の設定クラスを用意し、そこに @EnableJpaAuditing を付与することも可能です。

例えば以下のように JpaConfig クラスを作成して設定を行います。

JpaConfig.java
@Configuration
@EnableJpaAuditing
public class JpaConfig {
    // 設定内容
}

終わりに

今回のプロジェクトで JPA を使う機会があり、実際にいろいろな機能を試してみる中で便利な機能が多いと実感しました。
今後も JPA の機能をさらに深く理解しながら、気づいたことや学びを記事としてまとめていけたらと思います。

Discussion