はじめに
こちらの記事の続編です。
前回、カテゴリ管理機能のテーブル・画面・バックエンドの大まかな設計ができました。
本記事ではSpring Data JPA を使って カテゴリ管理機能のEntityとRepositoryを実装したいと思います。
前回と同様、考えたことをそのまま書き起こしつつ実装を進めていきます。
Entityの実装
まずはカテゴリテーブルと対応するEntityクラスを作成します。
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true)
private String categoryName;
@OneToMany(mappedBy = "category")
private List<Product> products;
@Column
private LocalDateTime createdAt;
@Column
private Long createdBy;
@Column
private LocalDateTime updatedAt;
@Column
private Long updatedBy;
}
①カラムの命名について
DB上はスネークケース(category_nameなど単語を_で区切る書き方)でカラム名を書いていましたが、
Java側では一般的な命名規約に従いキャメルケース(categoryNameなど単語の区切りを大文字にする書き方)で記載しています。
DBとの書式が違っても、JPAが自動でマッピングを行ってくれます。
②IDの採番について
idはレコードの作成時に連番を自動採番するよう、@GeneratedValue(strategy = GenerationType.IDENTITY)アノテーションを付けています。
③作成者と更新者の記録方法について
createdBy、updatedByはLong型にし、保存や更新を行ったユーザーIDが格納されるようにします。
ユーザーEntityそのものを保存する方法もあると思いますが、なんとなく重くなりそうな印象があり、IDのみを数値で保存するようにしました。
④作成時刻と更新時刻の自動保存について
データの作成時・更新時に自動で時間をセットする方法は...
・・・
調べました。
こちらの記事を参考にさせていただきました。
登録日時(createdAt)と更新日時(updatedAt)については以下のように変更しました。
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Category {
@Column(updatable = false)
@CreatedDate
private LocalDateTime createdAt;
@Column
@LastModifiedDate
private LocalDateTime updatedAt;
}
@EntityListeners(AuditingEntityListener.class):レコードの作成・更新時の情報設定を有効にする
@CreatedDate:レコードの作成日時がフィールドに自動的に設定される
updatable = false:こちら指定することで更新時にnullが入ってしまうのを防ぐ
@LastModifiedDate:レコードの更新日時がフィールドに自動的に設定される
とのことです。
この機能を使うために、Applicationクラスにアノテーションを一つ追加する必要がありました。
@SpringBootApplication
@EnableJpaAuditing // 👈コレ
public class SnapShelfApplication {
public static void main(String[] args) {
SpringApplication.run(SnapShelfApplication.class, args);
}
次に、setterとgetterを作成します。(STSの機能で自動で生成できます)
Entityのフィールドはprivateなので、外部からはgetter,setterを使ってアクセスします。
getterは全カラム、setterは自動保存されるid、createdAt、updatedAt以外に作成しました。
これでEntityが完成です。
Repositoryの実装
Jpa Repositoryを継承した基本形をつくりました。
@Repository
public interface CategoryRepository extends JpaRepository <Category, Long>{
}
これで、以下のメソッドが使えるようになります。
Spring Data JPAが持っているメソッド
-
save: idがあるかを自動判定し、INSERTまたはUPDATEを行う -
findById/findAll/findAllById: IDによるデータ取得や全件取得 -
count: 件数チェック -
existsById: IDでの存在チェック -
delete/deleteById/deleteAll: データ削除 - ページング・ソート
ここに存在しないメソッドについては、自分で定義する必要があります。
@Repository
public interface CategoryRepository extends JpaRepository <Category, Long>{
// カテゴリ名の重複チェック
boolean existsByCategoryName(String categoryName);
// カテゴリ名の部分一致検索
List<Category> findByCategoryNameContainingIgnoreCase(String keyword);
// カテゴリ名の重複チェック(更新時)
boolean existsByCategoryNameAndIdNot(String categoryName, Long id);
}
必要だと考えた3つのメソッドを追加しました。
①existsByCategoryNameメソッド
同じカテゴリ名がテーブルに既にあるかを調べ、boolean型で返します。
②findByCategoryNameContainingIgnoreCaseメソッド
カテゴリ名で部分一致検索を行います。
③existsByCategoryNameAndIdNotメソッド
カテゴリ名の重複チェックですが、更新時のチェックのため自身のカテゴリ名は対象外としています。
これらのメソッドは中身が書かれていませんが、Spring Data JPAはメソッド名からクエリを作成してくれるすごい機能があります。(クエリメソッドと呼ぶようです。)
どんなメソッドが作れるのか・命名規則については公式リファレンスを参考にしました。
以上でRepositoryが完成です。
まとめ
ここまでで、データを扱う基礎部分の実装が完了しました。
次回はカテゴリ管理のService層を実装し、リポジトリを呼び出して重複チェックや登録・更新処理の流れを整理していきます。
