Spring Boot JPA入門:エンティティ/リポジトリの基本と作り方
Spring Bootを使ったWebアプリケーション開発を、 環境構築から実践まで一通り学びたい方には、 定評のある入門書が参考になります。
Spring Boot 3 プログラミング入門をAmazonで見る※ Amazon広告リンク
生徒
「Spring Bootでデータベースと連携したいんですが、JPAって何から始めればいいですか?」
先生
「JPAを使えば、オブジェクトとデータベースのテーブルを自動で紐づけてくれますよ。まずはエンティティとリポジトリの基本から学ぶといいですね。」
生徒
「なるほど。エンティティって何ですか?リポジトリって何をするんですか?」
先生
「よし、じゃあSpring Boot JPAの基本的な使い方を、エンティティとリポジトリの作成手順と一緒に確認してみましょう。」
1. Spring BootとJPAの関係とは?
Spring Bootは、JavaでWebアプリケーションを簡単に開発できるフレームワークです。そして、JPA(Java Persistence API)は、オブジェクトとデータベースのテーブルをマッピングするための仕組みです。Spring Bootでは、JPAを使うことでSQLを書かずにデータベース操作が可能になります。初心者でもエンティティクラスとリポジトリインターフェースを用意するだけで簡単に使い始めることができます。
2. エンティティクラスとは何か?
エンティティ(Entity)クラスは、データベースのテーブルと1対1で対応するJavaクラスです。たとえば、ユーザー情報を管理する場合、「User」エンティティを作成します。このクラスにアノテーションをつけることで、どのフィールドが主キーか、どのカラムに対応するかを定義できます。
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
// getterとsetterを省略
}
3. リポジトリインターフェースの役割と作り方
リポジトリ(Repository)は、データベースへのアクセスを担当する部分です。Spring Data JPAを使えば、インターフェースを定義するだけで、自動的にCRUD操作(登録・取得・更新・削除)ができるようになります。以下のようにJpaRepositoryを継承することで、簡単にデータアクセスが可能になります。
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
// nameで検索するメソッド
List<User> findByName(String name);
}
Spring FrameworkやThymeleafを使った Webアプリ開発の全体像をやさしく理解したい人には、 この入門書が定番です。
Spring Framework超入門をAmazonで見る※ Amazon広告リンク
4. Spring BootでJPAを使うための設定
Spring BootでJPAを使うには、application.propertiesまたはapplication.ymlにデータベース接続情報を記述する必要があります。以下は一般的なMySQLの設定例です。
spring.datasource.url=jdbc:mysql://localhost:3306/sampledb
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
この設定を行うことで、Spring Boot起動時にテーブルが自動生成され、ログにSQLも出力されるようになります。
5. データを登録・検索する方法
実際にコントローラーからリポジトリを使ってデータベース操作を行ってみましょう。たとえば、ユーザー登録や一覧取得のコードは以下のようになります。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserRepository userRepository;
@PostMapping
public User create(@RequestBody User user) {
return userRepository.save(user);
}
@GetMapping
public List<User> findAll() {
return userRepository.findAll();
}
@GetMapping("/search")
public List<User> findByName(@RequestParam String name) {
return userRepository.findByName(name);
}
}
6. Spring Boot JPAの自動テーブル生成と注意点
JPAでは、エンティティクラスを定義するだけで、自動的にテーブルが作成されます。ddl-auto=updateに設定することで、変更があれば自動でテーブルが更新されます。ただし、本番環境ではこの自動更新は推奨されないため、マイグレーションツール(FlywayやLiquibase)の使用が一般的です。
7. JPAを使うメリットとは?
Spring Boot JPAを使うと、SQLを書かずに簡単にデータベース操作が可能になります。また、エンティティクラスにアノテーションをつけるだけで自動的にテーブルを作成し、リポジトリでデータ取得が簡単に行えるため、初心者でも理解しやすく、安全でメンテナンス性の高いコードを書くことができます。
8. 実務でよく使うアノテーションの一覧
JPAでよく使うアノテーションには以下のようなものがあります。
@Entity:テーブルにマッピングするクラスに指定@Id:主キーに指定@GeneratedValue:自動採番@Column:カラムの詳細設定@Table:テーブル名の指定(省略可)
これらを理解することで、より柔軟なエンティティ設計が可能になります。
9. よくあるエラーと解決方法
初心者がJPAを使う際によく遭遇するのが以下のようなエラーです。
- アノテーションの付け忘れ:
@Entityや@Idがないとテーブルが作られません - データ型のミスマッチ:Javaの型とDBの型が一致していないと保存エラーになります
- コネクションエラー:
application.propertiesの設定ミス
これらはメッセージをよく読み、設定やコードを丁寧に確認すれば解決できます。
まとめ
この記事で押さえたポイント
Spring Bootでデータベース連携を始めるとき、最初の壁になりやすいのが「どこに何を書けば動くのか」です。今回の記事では、JPAの基本として、エンティティとリポジトリを用意するだけで登録、取得、更新、削除といった操作が一気に楽になる流れを確認しました。エンティティはテーブルの設計図のような存在で、フィールドがカラムに対応します。リポジトリはデータアクセスの窓口で、決まりごとの形でインターフェースを作るだけで、面倒な処理を毎回書かずにすみます。
特に初心者のうちは、SQLを先に覚えようとして手が止まりがちですが、JPAを使うと「まずは保存できる、一覧が取れる」という成功体験を作りやすいのが強みです。エンティティに主キーを付け、リポジトリで基本操作を呼び出し、コントローラから利用する。この三点セットが頭に入ると、ユーザー管理、商品管理、予約管理などの画面を作るときも同じ考え方で進められます。
また、設定ファイルではデータベース接続情報や自動テーブル生成の挙動を指定しました。開発中は自動生成が便利ですが、運用ではデータの保護や変更履歴の管理が重要になります。だからこそ、仕組みを理解したうえで「いつまで自動更新を使うか」を判断できるようになることが大切です。エラーが出たときは、アノテーションの付け忘れ、型の不一致、接続設定の誤りという三つを順番に疑うだけでも、解決までの時間が短くなります。
動きをイメージするためのミニサンプル
最後に、エンティティとリポジトリとコントローラがどうつながるのかを、できるだけ短い形でまとめます。細かい書き方よりも「役割のつながり」を見るのが目的です。エンティティでデータの形を決め、リポジトリで操作方法を用意し、コントローラで画面や外部からの要求を受け取って呼び出します。
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// getter と setter は省略
}
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@PostMapping
public User create(@RequestBody User user) {
return userRepository.save(user);
}
@GetMapping
public List<User> findAll() {
return userRepository.findAll();
}
}
このサンプルで意識したいのは、コントローラの中で複雑なデータベース処理をしていない点です。保存はsave、一覧はfindAllというように、リポジトリの基本機能に任せています。こうしておくと、後から検索条件を追加したり、画面を増やしたりするときも、変更範囲が小さく保てます。結果として、読みやすく直しやすいコードになり、チーム開発でも扱いやすくなります。
つまずきやすい所の振り返り
初めてSpring Boot JPAを触ると、なぜテーブルが作られないのか、なぜ保存が失敗するのかで混乱しがちです。そんなときは、まずエンティティに@Entityが付いているか、主キーに@Idが付いているかを確認します。次に、リポジトリがJpaRepositoryを正しく継承しているか、型引数がエンティティと主キーの型になっているかを見ます。最後に、接続設定が正しいか、データベース名やパスワードが間違っていないかを点検します。この順番で見ていくと、原因が絞りやすくなります。
さらに、データ型の選び方も大切です。主キーは長い数値になりやすいのでLongを使うことが多く、日付や金額などは用途に合った型を選びます。型がずれると保存時に例外が出たり、取得時に意図しない値になったりします。小さな違いに見えても、実務では不具合の原因になりやすいので、ここは丁寧に扱うのがコツです。
実務で役立つ小さなコツ
実務でよく出てくるのは「一覧を出したら次は検索」「検索ができたら次は並び替え」「並び替えができたら次はページ分割」といった段階的な要求です。JPAの良いところは、基本の形を崩さずに少しずつ機能を足せる点にあります。たとえば、リポジトリにfindByNameのようなメソッド名を追加するだけで、名前検索ができるようになります。最初から難しい条件を詰め込むより、まずは一つの条件で動かし、必要になったら増やす方が、バグも少なく理解も深まります。
また、エンティティの命名は地味ですが重要です。テーブル名やカラム名に引っぱられすぎず、画面や業務で使う言葉に合わせると読みやすくなります。逆に、略語だらけにすると後から自分でも意味が分からなくなることがあります。迷ったら、ユーザー、商品、注文のように、誰が見ても伝わる日本語の概念を意識してクラス名を決めると安定します。
設定面では、開発中にSQLログを出しておくと安心です。保存や検索のタイミングでどんなSQLが発行されているかが見えると、動きの理解が一気に進みます。エラーが出たときも、ログにヒントが残るので追いかけやすくなります。さらに、データベースの文字コードやタイムゾーンの違いで想定外の表示になることもあるので、環境ごとの差が出そうな所は早めに確認しておくと後悔が減ります。
そして、初心者が意外とつまずくのが「保存したのに画面に反映されない」といった現象です。原因はキャッシュやトランザクション、あるいはフォームの値の受け取り方など様々ですが、まずはコントローラからリポジトリのsaveが呼ばれているか、戻り値に保存後の値が入っているかを確認するだけでも前に進めます。小さな確認を積み重ねることが、結局いちばんの近道です。
最後に、学習の順番としては「エンティティを一つ作る」「リポジトリで保存と一覧を試す」「コントローラから呼び出して画面やAPIで確認する」という流れがおすすめです。この順番なら、どこで詰まっているかが見えやすく、修正もしやすくなります。慣れてきたら、検索や更新、削除を同じ形で追加して、少しずつ手札を増やしていきましょう。
生徒
「エンティティとリポジトリを作るだけで、保存や一覧取得ができるのが驚きでした。最初は難しそうに見えたんですが、役割が分かると整理できますね。」
先生
「そうそう。まずは仕組みを分解して覚えるのが近道だね。エンティティはデータの形、リポジトリは操作の窓口、コントローラは呼び出し役。これが基本の並びだよ。」
生徒
「よくあるエラーも、アノテーションの付け忘れや型の不一致、設定ミスを順番に見ればいいと分かりました。焦って全部いじるより、確認手順を決めた方が楽ですね。」
先生
「その感覚が大事。あと、開発中は自動テーブル生成が便利でも、本番では扱い方が変わることも覚えておこう。今の段階では、まず動かして流れをつかむのが一番だね。」
生徒
「次は検索条件を増やしたり、更新や削除も試してみます。Spring Boot JPAの基本がつながった気がします。」
先生
「いいね。今回の基礎ができていれば、応用も同じ道筋で進められるよ。まずは小さな機能を足しながら、エンティティとリポジトリの感覚を身につけていこう。」