Spring BootのJPAでMySQLのデータ作成・更新時にユーザ名・日付を自動で記録する

Spring BootのJPAでMySQLのデータ作成・更新時にユーザ名と日付を毎回自動で指定のカラムに記録するようにする。

プロジェクトの準備

プロジェクトの作成と準備はSpring BootとJPAでMySQLに繋いでデータの操作をしている以下の記事を参考にする。

基本は以下の記事から追加、変更分をこの記事のコードでは説明する。

コード作成・記述

srcフォルダー以下のファイル構造は以下である。

まずは、データの作成、更新のユーザ、日付カラムを扱うAuditable.javaを作成する。

Auditable.java

@CreatedByでデータの作成者を、@CreatedDateデータの作成日を、@LastModifiedByでデータの最終更新者を、@LastModifiedDateでデータの最終更新日を扱う。

@Columnのnameで変数とテーブルのカラム名を対応させている。nullable = false, updatable = falseで作成者、作成日はデータのレコードに必須なのと変更を不可能にしている。

このAuditableをテーブルに対応したEntiryクラスでextendsすることでユーザや日付のカラムが作成され記録できるようになる。

Book.javaで扱いたい場合以下のように変更する。

Book.java

次に、作成者や変更者のユーザ名を記録するクラスを作る。

JPAでauditingを使えるようにいくつかの設定クラスを書く。

PersistenceConfig.java

AuditorAwareImpl.java

AuditorAwareImplクラスのgetCurrentAuditorでリターンしているものがユーザ名でこれがAuditableクラスのcreatedByやupdateByに代入される。

今回は、Userクラスにユーザ名を保持するuserNameを用意しそれをgetして用いる。

このUserクラスのuserNameに値を代入するのを以下のBookControllerクラスで行なっている。

BookController.java

今回はリクエスト時にヘッダー情報でユーザ名を送ってもらいそれをUserクラスのuserNameに入れて扱う。

Spring Bootでリクエストのヘッダー情報を取得するには@RequestHeader(“User-Name”) String userNameをメソッドの引数に入れるだけで良い。

ここではapplication.ymlの設定でddl-auto: updateと記述しているのでプロジェクト起動時に自動でテーブルは作成される。create table book…..;で作成しても問題はない。

MySQLのテーブルは以下のように作成されている。

動作確認

まずは新規のデータ作成。

MySQLを確認するとbook_id=1でデータができているのがわかる。create_by, create_date, update_by, update_dateにも値が自動で入っているのがわかる。

次にデータの更新をしてみる。

MySQLを確認するとbook_id=1のupdate_by, update_date, title, descriptionが変更しているのがわかる。

ついでにデータの取得もしてみるとAuditing情報は返ってこないことがわかる。

参考文献

Spring Boot JPA Auditing Example with AuditorAware Interface
Spring Boot JPA Auditing Example walks through the entire process of using Spring Data JPA for capturing audit information on record creation and updation

コメント