【Spring Boot】JPA/Hibernate の基本をやさしく解説

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

はじめに

Spring Boot で DB アクセスをするとき、
JPA(Java Persistence API)Hibernate という言葉をよく目にします。

  • JPA と Hibernate の違いは?
  • なぜ SQL を書かなくても DB に保存できるの?
  • Entity を new しただけでは保存されないのはなぜ?
  • UPDATE が自動で走る仕組みは?

こういった疑問は、
JPA(仕様)と Hibernate(実装)
の関係を理解すると一気に解決します。

この記事では、JPA/Hibernate の基本を
やさしく・実務寄り で整理していきます。


JPA と Hibernate の違いを一言でいうと…

JPA → ルール(仕様) Hibernate → そのルールを実装した“中身”

です。

例えるなら

  • JPA → 野球のルール
  • Hibernate → 実際にプレイする選手

Spring Boot は Hibernate を使って
JPA のルールに沿って DB とやり取りしています。


ORM(Object Relational Mapping)とは

一言でいうと、

「Java のオブジェクトと DB のテーブルを自動で変換する仕組み」

です。

  • Java → オブジェクト
  • DB → テーブル

本来は構造が違うものを、
JPA/Hibernate がうまく橋渡ししてくれます。


Entity が DB とつながる仕組み

Entity の例

Java
@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private int age;
}

ポイント

  • @Entity → このクラスは DB と対応する
  • @Id → 主キー
  • @GeneratedValue → 自動採番

これだけで Hibernate が
「User はテーブルと対応するクラスだな」
と認識します。


永続化(Persistence)の流れを理解する

Entity を new

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

まだただのオブジェクト。

save() を呼ぶ

Java
userRepository.save(user);

Hibernate が永続化コンテキストに登録。

トランザクションが commit

Service の @Transactional が終了すると commit。

Hibernate が SQL を発行

INSERT / UPDATE / DELETE を自動生成。


永続化コンテキスト(Persistence Context)とは

JPA/Hibernate の“心臓部”です。

一言でいうと、

「Entity の状態を管理するメモリ上の領域」

です。

できること

  • 同じ Entity は同じインスタンスで管理
  • 変更を自動で検知(Dirty Checking)
  • トランザクション内で一貫性を保つ

Dirty Checking(変更検知)とは

Hibernate の“魔法”のような機能です。

Java
User user = userRepository.findById(1L).get();
user.setName("jiro");

これだけで UPDATE が走ります。

理由:
永続化コンテキストが 「あ、値が変わった」 と検知するため。


Hibernate が SQL を生成する仕組み

Entity の状態を監視

  • 新規 → INSERT
  • 変更 → UPDATE
  • 削除 → DELETE

必要な SQL を自動生成

Hibernate が SQL を組み立てる。

JDBC 経由で DB に送る

最終的には JDBC が実行。


JPA/Hibernate のメリット

SQL を書かなくても CRUD ができる

Repository の save / findAll など。

オブジェクト指向で DB を扱える

Java のクラスとしてデータを扱える。

変更検知が便利

UPDATE を書かなくてもよい。

トランザクション管理と相性が良い

@Transaction が自然に使える。


JPA/Hibernate のデメリット

SQL が見えにくい

裏で何が起きているか分かりにくい。

複雑なクエリは書きにくい

JOIN が多い場合は JdbcTemplate の方が楽。

N+1 問題が起きやすい

Lazy ロードの罠。


実務での使い分け

JPA/Hibernate を使う場面

  • CRUD
  • 単純な検索
  • Entity を中心に扱う処理

JdbcTemplate を使う場面

  • 複雑な SQL
  • パフォーマンスが重要
  • 集計・分析系のクエリ

“JPA で書けるところは JPA、難しいところだけ SQL”
という使い分けが実務では多いです。


よくあるつまずきポイント

@Id がない

→ 起動エラー。

Lazy ロードで例外

→ トランザクション外でアクセスしている。

Entity をそのまま返す

→ DTO を使うのが基本。

UPDATE が走らない

→ 永続化コンテキスト外(Detached)。


まとめ

JPA/Hibernate は、

「オブジェクトと DB を自動でつないでくれる仕組み」

です。

  • JPA → ルール
  • Hibernate → 実装
  • Entity → テーブルと対応
  • 永続化コンテキスト → 状態管理
  • Dirty Checking → 自動 UPDATE
  • SQL は Hibernate が生成

難しく聞こえますが、
「Hibernate が裏で SQL を作ってくれている」
と理解できれば十分です。


decopon
decopon

JPA/Hibernate を理解すると、
Spring Data JPA の“魔法”が現実的に見えてきます。
裏側の仕組みを知るだけで、
DB アクセスの理解がぐっと深まります。
あなたの開発が、今日より少しだけ楽になりますように。

moco
moco

Hibernate さんって、
裏でこっそり SQL を作ってくれてるんだね…
やさしいね。

コメント

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