@Entity, @Id, @GeneratedValueの使い方を覚えよう|Springのデータベース連携入門
新人
「Springアプリでデータベースとやり取りするには、どうすればいいんでしょうか?」
先輩
「それにはまず、@Entityアノテーションを使って、Javaクラスをエンティティとして定義する必要があるよ。」
新人
「エンティティって何ですか?普通のクラスとは違うんですか?」
先輩
「そこから丁寧に説明するよ。まずは@Entityの基本から見ていこう。」
1. Springアプリでデータベースとやり取りするには?
Springアプリケーションでデータベースとやり取りするには、Javaクラスを@Entityとして定義し、データベースのテーブルと対応させる必要があります。
この@Entityアノテーションは、Javaクラスを「エンティティクラス」としてマークすることで、Spring Data JPAやHibernateが自動的にデータベースのレコードと対応付けてくれます。
例えば、ユーザー情報を保存するクラスを作りたい場合、次のように@Entityを使います。
import jakarta.persistence.Entity;
@Entity
public class User {
}
このように@Entityを付けるだけで、Springはこのクラスを「データベースに保存可能なエンティティ」として扱ってくれます。
2. エンティティクラスとは?Javaクラスとの違い
通常のJavaクラスは、ロジックを記述するためのもので、データベースと直接関係はありません。
一方、エンティティクラスは、データベースの「テーブルの1行」に対応するものです。
そのため、エンティティクラスには以下のような特徴があります。
- クラスに
@Entityアノテーションを付ける - 主キーを表すフィールドに
@Idを付ける - 自動採番などを設定する場合は
@GeneratedValueを使う
例えば、以下のようなクラスがエンティティクラスの基本的な形です。
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
// GetterとSetterは省略
}
このように定義することで、SpringはこのBookクラスを元に、id・title・authorのカラムを持つテーブルを作成・操作することが可能になります。
3. @Entityを付けると何ができるのか?
@Entityを付けると、そのクラスが自動的にデータベースの対象になります。
例えば、Spring Data JPAでは、エンティティクラスに対応するテーブルを自動生成したり、CRUD操作(登録・取得・更新・削除)を自動で行うことができます。
つまり、SQLを書かずにオブジェクトだけでデータベースと連携できるのです。
以下のようなリポジトリインターフェースを用意すれば、簡単にデータを操作できます。
import org.springframework.data.repository.CrudRepository;
public interface BookRepository extends CrudRepository<Book, Long> {
}
このインターフェースだけで、save()・findById()・deleteById()などのメソッドが使えるようになります。
つまり、@Entityを使えば、Javaクラスがそのままデータベースのテーブルのように扱えるということです。
Java初心者やSpring初心者でも、クラスを使って「データベース連携」が簡単にできるのが、@Entityの強力なメリットなのです。
4. 主キーとは?なぜ@Idが必要なのか
新人
「ところで、@Idって必ず付けないといけないんですか?」
先輩
「うん、エンティティには@Idで『主キー』を指定するのが必須なんだ。」
主キー(しゅきー)とは、データベースの中で「このレコードはこれですよ」と特定するための番号や値のことです。例えば「ID」や「社員番号」のように、絶対に重ならない値を使います。
Springでは、@Entityを付けたエンティティクラスに、最低でも1つの@Idを付ける必要があります。これがないと、どのデータがどれなのか区別できず、保存も更新もできなくなってしまいます。
主キーがあるからこそ、データベースのレコードを安全に一意に扱えるわけです。つまり、@Idはデータベース操作において絶対に欠かせないアノテーションなのです。
5. @Idアノテーションの意味と付け方(コード例あり)
新人
「@Idって、どこに付けるんですか?決まりとかあるんでしょうか?」
先輩
「基本的には、主キーとして使いたいフィールドの上に@Idを付けるだけでOKだよ。」
たとえば、エンティティクラスで主キーにLong型のidを使いたい場合は、次のようにします。
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Product {
@Id
private Long id;
private String name;
private int price;
// GetterとSetterは省略
}
この例では、idというフィールドに@Idを付けています。このidがデータベース上で「主キー」として機能し、1つ1つのデータを区別するための値になります。
SpringやHibernateは、この@Idを見て、「このフィールドが主キーだ」と自動的に判断してくれます。
主キーには基本的に数値(LongやInteger)を使うのが一般的ですが、Stringでも可能です。ただし、基本的には自動で番号を振れる数値のほうが管理が楽です。
6. 自動採番とは?@GeneratedValueの仕組みと種類
新人
「さっきのidって、自分で毎回手動で番号を決めるんですか?」
先輩
「毎回番号を決めるのは面倒だし、重複のリスクもあるから、@GeneratedValueで自動採番するのが一般的だよ。」
SpringやJPAでは、主キーの値を自動で設定する仕組みがあり、それを@GeneratedValueというアノテーションで実現します。
これを使えば、新しいデータを保存するたびに、自動で番号が増えていくようになります。
よく使われるのは以下の2つの設定です。
GenerationType.IDENTITY:データベース側に任せて、自動採番される(MySQLなど)GenerationType.AUTO:JPAが自動的に適切な方式を選んでくれる
実際のコード例は以下のようになります。
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// GetterとSetterは省略
}
このように@GeneratedValueを@Idと一緒に使うことで、レコードを登録するたびにidが「1、2、3…」のように自動で増えていきます。
GenerationType.IDENTITYは、MySQLなどの「AUTO_INCREMENT」機能と連携して番号を振ってくれるので、もっともシンプルで初心者にも扱いやすいです。
一方、GenerationType.AUTOは環境によって動作が異なるため、最初のうちはIDENTITYを選んでおくのがおすすめです。
このように@GeneratedValueを活用することで、主キーの値を手動で管理する必要がなくなり、ミスや重複も防げるようになります。
7. よくあるミスとその対策
新人
「エンティティを使うとき、よくある間違いってありますか?」
先輩
「あるある。特に初心者がつまずきやすいポイントをいくつか紹介しよう。」
Springのエンティティ定義でよくあるミスとしては、次のようなものがあります。
- @Entityを付け忘れる:Javaクラスに
@Entityを付けないと、Springがそのクラスをエンティティとして認識できません。 - @Idを付け忘れる:主キーが指定されていないと、JPAはテーブルを正しく作成できず、実行時にエラーになります。
- 主キーの型が不適切:たとえば
String型に@GeneratedValueを付けると、動作しません。LongやIntegerなど、数値型を使いましょう。 - フィールド名とカラム名の不一致:DB設計とクラス定義が一致していないと、意図しない動作になることもあります。
このようなミスを防ぐためには、まずアノテーションを正確に記述することと、正しい型を使うことが大切です。
また、pleiadesでの開発時には、ビルドエラーや警告にしっかり目を通すことで、ミスに早く気づくことができます。
8. 実際に@Entityを使ってエンティティを定義し、データベースに保存する流れ
新人
「理論はわかってきたんですが、実際にデータベースに保存するにはどうしたらいいですか?」
先輩
「じゃあ、簡単なサンプルを作って、保存までの流れを一緒に見てみよう!」
Springアプリケーションでデータベースにデータを保存するには、以下のような構成を用意します。
- エンティティクラス(@Entity, @Id, @GeneratedValueを使って定義)
- リポジトリインターフェース(CrudRepositoryを継承)
- コントローラクラス(@Controllerで定義し、保存処理を記述)
以下は、書籍情報を保存するSpringアプリのサンプルコードです。
package com.example.demo.model;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
private String author;
// GetterとSetterは省略
}
package com.example.demo.repository;
import com.example.demo.model.Book;
import org.springframework.data.repository.CrudRepository;
public interface BookRepository extends CrudRepository<Book, Long> {
}
package com.example.demo.controller;
import com.example.demo.model.Book;
import com.example.demo.repository.BookRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class BookController {
@Autowired
private BookRepository bookRepository;
@PostMapping("/add")
public String addBook() {
Book book = new Book();
book.setTitle("はじめてのSpring");
book.setAuthor("山田 太郎");
bookRepository.save(book);
return "success";
}
}
この例では、@Entityでエンティティを定義し、@Idと@GeneratedValueで主キーの自動採番を設定しています。
BookRepositoryはSpringが自動で実装してくれるので、save()メソッドを呼ぶだけでデータが保存されます。
保存処理は@Controller内で行い、Spring MVCのルーティングで/addパスにアクセスすると保存が実行されます。
このように、Springではコード量を最小限に抑えて、簡単にデータベース操作が可能になります。
9. @Entity, @Id, @GeneratedValueの関係を整理しよう
新人
「最後に、全体の流れをもう一度まとめてもらえますか?」
先輩
「もちろん。ここで、3つのアノテーションの関係を整理しておこう。」
以下のように理解するとわかりやすいです。
- @Entity:このクラスはデータベースに対応したエンティティです、と宣言
- @Id:このフィールドが主キーで、1つ1つのレコードを区別する
- @GeneratedValue:主キーの値を自動で作成(自動採番)するように設定
つまり、@Entityが「このクラスをデータベースとつなげる役目」、@Idが「どの項目でデータを識別するかを指定」、@GeneratedValueが「その識別子を自動で作ってくれる」わけです。
この3つを組み合わせることで、SpringアプリケーションはJavaのクラスとデータベースをスムーズに連携させることができます。
特に初心者にとっては、「何が必須で、どこに何を付けるか」を理解することが重要です。
そして、主キーがあることで初めて、データの保存・取得・更新・削除といった操作が可能になるという点をしっかり押さえておきましょう。
まとめ
この記事では、Springアプリケーションでデータベースと連携する際に欠かせない@Entity、@Id、@GeneratedValueの三つのアノテーションについて、基礎から実践まで体系的に学びました。特にJavaクラスを「データベースと対応付ける仕組み」であるエンティティの概念は、Spring Data JPAの中核となる知識であり、Java初心者やSpring MVC学習者が必ず理解しておくべき重要ポイントです。 @Entityを付けたクラスはデータベースのテーブルと1対1で対応し、クラスの各フィールドがテーブルのカラムに対応します。そして@Idがその中で唯一の識別子=主キーを示し、@GeneratedValueがその主キーを自動生成する役割を担います。これら三つのアノテーションを正しく理解することで、データの保存・読み込み・更新・削除といった基本操作を驚くほど少ないコード量で実現できる「Spring JPAの生産性」を実感できるようになります。 また、この記事ではエンティティの定義方法だけでなく、よくあるエラー(@Entityの付け忘れ、主キーの型の不一致、自動採番の設定忘れなど)や、実際にデータベースへ保存するまでのコード構成(エンティティ→リポジトリ→コントローラ)も丁寧に確認しました。さらに、Spring Boot環境ではSQL文を書かずにエンティティ操作だけでCRUD処理が行えるため、学習効率と開発効率が大幅に向上します。 ここでは、記事の理解をさらに深めるために、@Entity・@Id・@GeneratedValueを使ったシンプルなサンプルコードを掲載します。
サンプルプログラム:@Entityと@Idと@GeneratedValueを使った基本エンティティ
以下は、記事で学んだ内容を踏まえて構成した最小構成のエンティティサンプルです。
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
@Entity
public class SampleItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int stock;
// GetterとSetterは省略
}
このエンティティはidに自動採番を設定し、名前と在庫数を持つシンプルな構成です。Spring Data JPAでは、このエンティティに対応するリポジトリを作成するだけで、保存・取得・削除などの操作が簡単に行えるようになります。
import org.springframework.data.repository.CrudRepository;
public interface ItemRepository extends CrudRepository<SampleItem, Long> {
}
このように@Entity・@Id・@GeneratedValueは、Javaクラスをデータベーステーブルとして扱うための最小構成であり、「Spring JPAの基礎そのもの」です。初心者はまずこの3つをしっかり押さえることで、テーブルの設計とコードの設計がスムーズに結びつき、Springアプリケーションの理解が一気に進みます。
新卒エンジニア:「@Entityと@Idと@GeneratedValueを全部覚えると、Springのデータベース連携って思っていたより簡単だと感じました!」
先輩社員:「そうなんだよ。最初はアノテーションが多く見えても、それぞれの役割を理解すれば一気にスッキリするよ。@Entityで“エンティティ化”、@Idで“主キー指定”、@GeneratedValueで“自動採番”。この三つが基本だね。」
新卒エンジニア:「特にCRUD処理がSQL無しでできるのが驚きでした。Spring Data JPAすごいですね!」
先輩社員:「だろう?開発効率が桁違いに上がるから、実務でもよく使われている仕組みなんだ。今回のサンプルが理解できていれば、もうエンティティの基本はバッチリだよ。」
新卒エンジニア:「これからもっと複雑なテーブルでも、今回の知識を使って挑戦してみます!」
先輩社員:「その調子!エンティティを理解すれば、Springの世界が一気に広がるよ。」