1.

Hibernate

編集

Hibernate とは

Hibernate は、Java の代表的な ORM (Object Relational Mapping) ライブラリです。Java クラス (エンティティ) とリレーショナルデータベースのテーブルをマッピングし、SQL を直接書かずにオブジェクトとして CRUD 操作を行えるようにします。

ライセンスは LGPL の OSS で、現在は JPA (Jakarta Persistence API) の参照実装としても広く採用されています。Spring Boot で spring-boot-starter-data-jpa を入れたとき、内部で動いているのが Hibernate です。

主な特徴

  • ORM — Java クラスとテーブルのマッピングを宣言的に定義
  • JPA 準拠jakarta.persistence / javax.persistence アノテーションをそのまま使える
  • HQL / JPQL — SQL に似た独自クエリ言語でオブジェクト中心に検索
  • Criteria API — 型安全にクエリを組み立てる
  • 遅延ロード (Lazy Loading) — 関連オブジェクトをアクセス時に初めて取得
  • キャッシュ機構 — 一次キャッシュ (セッション) / 二次キャッシュ (アプリ全体)
  • マルチDB対応 — Dialect を切り替えるだけで MySQL / PostgreSQL / Oracle / SQL Server 等を扱える

典型的なエンティティ定義

@Entity
@Table(name = "users")
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;

  @Column(nullable = false, length = 100)
  private String name;

  @OneToMany(mappedBy = "user")
  private List<Order> orders;
  // ... getters / setters
}

基本的な操作

EntityManager em = ...;
em.getTransaction().begin();

User u = new User();
u.setName("Taro");
em.persist(u);      // INSERT

User found = em.find(User.class, 1L);  // SELECT by PK
found.setName("Jiro");            // UPDATE (dirty check)

em.remove(found);    // DELETE

em.getTransaction().commit();

主要なアノテーション

アノテーション役割
@Entityエンティティクラスを示す
@Tableテーブル名・スキーマ指定
@Id / @GeneratedValue主キー・採番戦略
@Column列名・長さ・NULL 許可・unique
@OneToOne / @OneToMany / @ManyToOne / @ManyToMany関連
@JoinColumn外部キー列
@Embeddable / @Embedded値オブジェクトの埋め込み
@Transient永続化対象外フィールド
@Version楽観的ロック用バージョン列

クエリの3つの書き方

方式特徴
JPQL / HQL文字列ベース。FROM User u WHERE u.name = :name
Criteria API型安全。リファクタリングに強いがやや冗長
Native Query素のSQL。DB固有機能を使いたい時

パフォーマンス上の落とし穴

  • N+1問題: コレクションをループで参照する際に SELECT が件数分発行される。JOIN FETCH@EntityGraph で解決
  • LazyInitializationException: セッション外で遅延ロード関連にアクセスした際に発生
  • 巨大コレクションを取得: findAll を巨大テーブルに使わない
  • キャッシュの効きすぎ: バッチ更新後に古い値が見えるなど。em.clear() や明示的フラッシュ
  • SQLログを有効化 (spring.jpa.show-sql=truehibernate.format_sql=true) して発行 SQL を確認

Hibernate / JPA / Spring Data JPA の関係

  • JPA: 仕様 (Jakarta Persistence)
  • Hibernate: その実装ライブラリ
  • Spring Data JPA: JPA をさらに使いやすくするレポジトリ抽象。内部で Hibernate を呼ぶ

注意点

  • Jakarta EE 9 以降、パッケージは javax.persistencejakarta.persistence に変わっている
  • 古い net.sf.hibernate 系 (Hibernate 2) は EOL。新規開発では使わない
  • マイグレーションは Hibernate の hbm2ddl.auto ではなく、Flyway / Liquibase を使うのが本番運用での定石

関連

編集
Post Share
子ページ
  1. エラー一覧
同階層のページ
  1. Hibernate
  2. JasperReport