はじめに
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 の例
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private int age;
}ポイント
- @Entity → このクラスは DB と対応する
- @Id → 主キー
- @GeneratedValue → 自動採番
これだけで Hibernate が
「User はテーブルと対応するクラスだな」
と認識します。
永続化(Persistence)の流れを理解する
Entity を new
User user = new User("taro", 20);まだただのオブジェクト。
save() を呼ぶ
userRepository.save(user);Hibernate が永続化コンテキストに登録。
トランザクションが commit
Service の @Transactional が終了すると commit。
Hibernate が SQL を発行
INSERT / UPDATE / DELETE を自動生成。
永続化コンテキスト(Persistence Context)とは
JPA/Hibernate の“心臓部”です。
一言でいうと、
「Entity の状態を管理するメモリ上の領域」
です。
できること
- 同じ Entity は同じインスタンスで管理
- 変更を自動で検知(Dirty Checking)
- トランザクション内で一貫性を保つ
Dirty Checking(変更検知)とは
Hibernate の“魔法”のような機能です。
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 を作ってくれている」
と理解できれば十分です。

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

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

コメント