Help us understand the problem. What is going on with this article?

Spring Data JPA で監査情報を記録

More than 3 years have passed since last update.

はじめに

Spring Data JPA で、監査情報を自動付与してみます。
監査情報とは「いつ」「だれが」データを登録したかの情報で、この情報があると、サービス運用時のトラブル対応時に役立ちます。
本当は Spring の主要機能の一つである AOP を学習するための題材として考えていたのですが、意外な落とし穴がありました。。

監査情報の記録方法

アノテーションを設定

なんと便利なことに、監査情報を付与するアノテーションがありました。いちいち AOP を実装する必要がないのです!
こんな感じで大丈夫です。

@CreatedBy
private Long createMemberId;

@CreatedDate
private Date createDate;

@LastModifiedBy
private Long modifyMemberId;

@LastModifiedDate
private Date modifyDate;

登録者/更新者情報

以前の投稿で認証機能を実装してみましたが、今回は 操作者には認証情報のIDを設定することにします。

こんな感じで設定します。

JpaConfig.java
@EnableJpaAuditing
@Configuration
public class JpaConfig
{
    @Bean
    public AuditorAware<Long> auditorAware()
    {
        return new SecurityAuditor();
    }

    public static class SecurityAuditor implements AuditorAware<Long>
    {
        @Override
        public Long getCurrentAuditor()
        {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            if (authentication == null || !authentication.isAuthenticated())
            {
                return null;
            }
            MemberEntity memberEntity = (MemberEntity) authentication.getPrincipal();

            return memberEntity.getId();
        }
    }
}

エンティティの共通部分を別クラスにまとめる

エンティティごとに監査情報用の項目を定義するのは面倒なので、親クラスでまとめて定義することにします。
省略してますが、必要に応じて、setter/getter も実装してください。
ポイントは、MappedSuperclass アノテーションをつけることです。

BaseEntity.java
@MappedSuperclass
public class BaseEntity
{
    @CreatedBy
    private Long createMemberId;

    @CreatedDate
    private Date createDate;

    @LastModifiedBy
    private Long modifyMemberId;

    @LastModifiedDate
    private Date modifyDate;
}

終わりに

Spring 便利ですね。
機能豊富で開発が簡略化できる仕組みがたくさんそろってるけど、なかなか追いつけないのが悩みの種です。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away