0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Data JPAでカテゴリ管理機能を実装する【Entity・Repository】

0
Last updated at Posted at 2026-02-07

はじめに

こちらの記事の続編です。

前回、カテゴリ管理機能のテーブル・画面・バックエンドの大まかな設計ができました。

本記事ではSpring Data JPA を使って カテゴリ管理機能のEntityRepositoryを実装したいと思います。
前回と同様、考えたことをそのまま書き起こしつつ実装を進めていきます。

Entityの実装

まずはカテゴリテーブルと対応するEntityクラスを作成します。

Category.java
@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)アノテーションを付けています。

③作成者と更新者の記録方法について

createdByupdatedByLong型にし、保存や更新を行ったユーザーIDが格納されるようにします。
ユーザーEntityそのものを保存する方法もあると思いますが、なんとなく重くなりそうな印象があり、IDのみを数値で保存するようにしました。

④作成時刻と更新時刻の自動保存について

データの作成時・更新時に自動で時間をセットする方法は...

・・・

調べました。

こちらの記事を参考にさせていただきました。

登録日時(createdAt)と更新日時(updatedAt)については以下のように変更しました。

Category.java
@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クラスにアノテーションを一つ追加する必要がありました。

SnapShelfApplication.java
@SpringBootApplication
@EnableJpaAuditing // 👈コレ
public class SnapShelfApplication {

	public static void main(String[] args) {
		SpringApplication.run(SnapShelfApplication.class, args);
	}

次に、settergetterを作成します。(STSの機能で自動で生成できます)

image.png

Entityのフィールドはprivateなので、外部からはgetter,setterを使ってアクセスします。

getterは全カラム、setterは自動保存されるidcreatedAtupdatedAt以外に作成しました。

これでEntityが完成です。

Repositoryの実装

Jpa Repositoryを継承した基本形をつくりました。

CategoryReposity.java
@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: データ削除
  • ページング・ソート

ここに存在しないメソッドについては、自分で定義する必要があります。

CategoryRepository.java
@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層を実装し、リポジトリを呼び出して重複チェックや登録・更新処理の流れを整理していきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?