はじめに
Spring Data JPA を使っていると、
Entity(エンティティ) というクラスを必ず作ります。
- Entity って何?
- なぜアノテーションを付けるだけで DB とつながるの?
- save したらどうやって INSERT されるの?
- 値を変えただけで UPDATE が走るのはなぜ?
こういった疑問は、JPA の“永続化の仕組み”を理解すると一気に解決します。
この記事では、Entity の基本と永続化の流れを
やさしく・実務寄り で整理していきます。
Entity とは
一言でいうと、
「DB のテーブルと対応するクラス」
です。
- クラス → テーブル
- フィールド → カラム
- インスタンス → レコード
という対応関係になります。
Entity の基本例
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
}重要なアノテーション
- @Entity → このクラスは DB と対応する
- @Id → 主キー
- @GeneratedValue → 自動採番
これだけで、JPA がこのクラスを“永続化対象”として扱います。
永続化(Persistence)とは
一言でいうと、
「Java のオブジェクトを DB に保存したり、DB から読み込んだりする仕組み」
です。
JPA はこの永続化を自動で行ってくれます。
永続化の流れをふわっと理解する
Entity を new する
User user = new User("taro", 20);この時点では ただの Java オブジェクト です。
save() を呼ぶ
userRepository.save(user);ここで初めて、
EntityManager が user を永続化対象として管理 します。
トランザクションが commit される
Service 層で @Transactional が付いていると、
メソッド終了時に commit が走ります。
JPA が SQL を自動生成して実行
- INSERT
- UPDATE
- DELETE
必要な SQL を JPA が自動で発行します。
永続化の仕組みのキモ:永続化コンテキスト
JPA の核心は 永続化コンテキスト(Persistence Context) です。
一言でいうと、
「Entity の状態を管理するメモリ上の領域」
です。
永続化コンテキストがあるからできること
- Entity の変更を自動で検知(Dirty Checking)
- 同じ Entity を何度取得しても同じインスタンス
- トランザクション内で一貫性を保てる
Dirty Checking(変更検知)とは
JPA の魔法のような機能です。
User user = userRepository.findById(1L).get();
user.setName("jiro");これだけで、 UPDATE 文が自動で発行されます。
理由:
永続化コンテキストが「変更された」と判断するため。
Entity のライフサイクルを理解する
Transient(非永続)
new しただけの状態。
Persistent(永続)
save() された、または find() で取得された状態。
永続化コンテキストに管理されている。
Detached(分離)
永続化コンテキストから切り離された状態。
Removed(削除)
削除対象としてマークされた状態。
このライフサイクルを理解すると、
「なぜ UPDATE が走らない?」
「なぜ変更が反映されない?」
といった疑問が解決します。
実務でよくあるつまずき
@Id を付け忘れて起動エラー
Entity の必須項目です。
getter/setter がなくて値が入らない
Lombok の @Data を付け忘れるパターン。
Lazy ロードでエラー
トランザクション外で遅延ロードすると例外が発生します。
Entity をそのままレスポンスに返す
外部に DB 構造が漏れるため、DTO を使うのが基本です。
Entity をもっと活かすポイント
DTO と組み合わせる
Entity を外に出さないのが鉄則。
@Transactional と組み合わせる
永続化コンテキストが正しく動きます。
@Column で細かい設定
- nullable
- unique
- length
などを指定できます。
関連(@OneToMany / @ManyToOne)を理解する
複雑なデータ構造も表現できます。
まとめ
Entity は、
「DB のテーブルと対応する永続化対象のクラス」
です。
- @Entity / @Id / @GeneratedValue
- 永続化コンテキストが状態を管理
- Dirty Checking で自動 UPDATE
- ライフサイクルを理解するとトラブルが減る
- DTO と組み合わせると安全
難しく聞こえますが、
「Entity は DB のデータを表すクラス」
「JPA が自動で保存・更新してくれる」
と理解できれば十分です。

Entity の仕組みを理解すると、
JPA の“魔法”が一気に現実的に見えてきます。
永続化コンテキストや Dirty Checking を知るだけで、
データアクセスの理解がぐっと深まります。
あなたの開発が、今日より少しだけ楽になりますように。

オブジェクトがそのまま DB とつながるなんて…
なんだか不思議でかわいいね。

コメント