【Spring Boot】Entity の基本(永続化の仕組み)をやさしく解説

Java入門・実践
スポンサーリンク
スポンサーリンク

はじめに

Spring Data JPA を使っていると、
Entity(エンティティ) というクラスを必ず作ります。

  • Entity って何?
  • なぜアノテーションを付けるだけで DB とつながるの?
  • save したらどうやって INSERT されるの?
  • 値を変えただけで UPDATE が走るのはなぜ?

こういった疑問は、JPA の“永続化の仕組み”を理解すると一気に解決します。

この記事では、Entity の基本と永続化の流れを
やさしく・実務寄り で整理していきます。


Entity とは

一言でいうと、

「DB のテーブルと対応するクラス」

です。

  • クラス → テーブル
  • フィールド → カラム
  • インスタンス → レコード

という対応関係になります。


Entity の基本例

Java
@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 する

Java
User user = new User("taro", 20);

この時点では ただの Java オブジェクト です。

save() を呼ぶ

Java
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 の魔法のような機能です。

Java
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 が自動で保存・更新してくれる」
と理解できれば十分です。


decopon
decopon

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

moco
moco

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

コメント

タイトルとURLをコピーしました