Java Hibernate フレームワーク

Java 常用类库Java よく使うクラスライブラリ


Hibernate は、Java アプリケーションのデータベース操作を簡素化するためのオープンソースのオブジェクト関係マッピング(ORM)フレームワークです。

Hibernate は Java オブジェクトをデータベーステーブルにマッピングし、開発者が複雑な SQL 文を書くことなく、オブジェクト指向の方法でデータベースを操作できるようにします。

Hibernate の主な利点は次のとおりです:

  • JDBC の定型コードを削減
  • 透過的な永続化メカニズムを提供
  • 複数のデータベースをサポート
  • キャッシュメカニズムを提供してパフォーマンスを向上
  • トランザクション管理をサポート

Hibernate コアアーキテクチャ

Hibernate アーキテクチャは、複数の重要なコンポーネントで構成されています:

1. SessionFactory

SessionFactory はスレッドセーフなオブジェクトであり、通常はアプリケーション全体で一度だけ作成されます。その役割は次のとおりです:

  • Session インスタンスの作成
  • 生成された SQL 文のキャッシュ
  • マッピングメタデータのキャッシュ

例

Configuration configuration = new Configuration().configure();
SessionFactory sessionFactory = configuration.buildSessionFactory();

2. Session

Session は Hibernate のコアインターフェースであり、データベースとの1回のセッションを表します。次のものを提供します:

  • 作成、読み取り、更新、削除操作
  • トランザクション管理
  • クエリ機能

例

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

// データベース操作を実行

transaction.commit();
session.close();

3. Transaction

Transaction インターフェースはデータベーストランザクションの概念をカプセル化し、操作の原子性を保証します。


Hibernate マッピング設定

Hibernate は2つの設定方法をサポートしています:

1. XML マッピングファイル

従来の方法で、.hbm.xml ファイルを使用してエンティティクラスとデータベーステーブルのマッピング関係を定義します。

例

<!-- User.hbm.xml -->
<hibernate-mapping>
    <class name="com.example.User" table="USERS">
        <id name="id" column="USER_ID">
            <generator class="native"/>
        </id>
        <property name="name" column="USER_NAME"/>
        <property name="email" column="USER_EMAIL"/>
    </class>
</hibernate-mapping>

2. アノテーション方式

現代の Hibernate では、JPA アノテーション方式の使用が推奨されています:

例

@Entity
@Table(name = "USERS")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
   
    @Column(name = "USER_NAME")
    private String name;
   
    @Column(name = "USER_EMAIL")
    private String email;
   
    // getters and setters
}

Hibernate クエリ言語

Hibernate は複数のクエリ方法を提供しています:

1. HQL (Hibernate Query Language)

オブジェクト指向のクエリ言語で、SQL に似ていますが、テーブルではなくオブジェクトを操作します。

例

String hql = "FROM User WHERE name = :name";
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("name", "John");
List<User> users = query.list();

2. Criteria API

型安全なクエリ構築方法:

例

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<User> criteria = builder.createQuery(User.class);
Root<User> root = criteria.from(User.class);
criteria.select(root).where(builder.equal(root.get("name"), "John"));
List<User> users = session.createQuery(criteria).getResultList();

3. ネイティブ SQL クエリ

複雑な SQL を実行する必要がある場合:

例

String sql = "SELECT * FROM USERS WHERE USER_NAME = :name";
NativeQuery<User> query = session.createNativeQuery(sql, User.class);
query.setParameter("name", "John");
List<User> users = query.list();

Hibernate キャッシュメカニズム

Hibernate はパフォーマンスを向上させるために2レベルのキャッシュを提供します:

1. 一次キャッシュ (Session キャッシュ)

  • デフォルトで有効
  • ライフサイクルは Session と同じ
  • 同じ Session 内で同じクエリが1回だけ実行されることを保証します

2. 二次キャッシュ (SessionFactory キャッシュ)

  • 明示的な設定が必要
  • Session 間で共有される
  • よく使われる実装:EhCache, Infinispan など

設定例:

例

<!-- hibernate.cfg.xml -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
    org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>

Hibernate トランザクション管理

Hibernate は2つのトランザクション管理方法をサポートしています:

1. JDBC トランザクション管理

スタンドアロンアプリケーションに適しています:

例

Session session = sessionFactory.openSession();
Transaction tx = null;
try {
    tx = session.beginTransaction();
    // ビジネスロジック
    tx.commit();
} catch (Exception e) {
    if (tx != null) tx.rollback();
    throw e;
} finally {
    session.close();
}

2. JTA トランザクション管理

分散環境(Java EE アプリケーションサーバーなど)に適しています。


Hibernate ベストプラクティス

  1. 遅延ロードを適切に使用する:N+1 クエリ問題を回避する
  2. バッチ処理:大量のデータ操作時にはバッチ処理を使用する
  3. 長時間のセッションを避ける:速やかに Session を閉じる
  4. オブジェクト関係を適切に設計する:複雑なオブジェクトグラフを避ける
  5. 接続プールを使用する:パフォーマンスを向上させる

例

// バッチ挿入の例
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for (int i = 0; i < 100000; i++) {
    User user = new User("User" + i, "user" + i + "@example.com");
    session.save(user);
   
    if (i % 50 == 0) { // 50件ごとに1回フラッシュ
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

Hibernate は成熟した ORM フレームワークとして、Java アプリケーションのデータアクセス層の開発を大幅に簡素化します。適切な設定と使用により、開発効率とアプリケーションのパフォーマンスを大幅に向上させることができます。

Java 常用类库Java よく使うクラスライブラリ

その他の拡張