JPA/Hibernate パターン
Spring Bootでのデータモデリング、リポジトリ、パフォーマンスチューニングに使用します。
エンティティ設計
監査を有効化:
リレーションシップとN+1防止
- デフォルトで遅延ロード。必要に応じてクエリで
JOIN FETCHを使用 - コレクションでは
EAGERを避け、読み取りパスにはDTOプロジェクションを使用
リポジトリパターン
- 軽量クエリにはプロジェクションを使用:
トランザクション
- サービスメソッドに
@Transactionalを付ける - 読み取りパスを最適化するために
@Transactional(readOnly = true)を使用 - 伝播を慎重に選択。長時間実行されるトランザクションを避ける
ページネーション
カーソルライクなページネーションには、順序付けでJPQLに id > :lastId を含める。
インデックス作成とパフォーマンス
- 一般的なフィルタ(
status、slug、外部キー)にインデックスを追加 - クエリパターンに一致する複合インデックスを使用(
status, created_at) select *を避け、必要な列のみを投影saveAllとhibernate.jdbc.batch_sizeでバッチ書き込み
コネクションプーリング(HikariCP)
推奨プロパティ:
PostgreSQL LOB処理には、次を追加:
キャッシング
- 1次キャッシュはEntityManagerごと。トランザクション間でエンティティを保持しない
- 読み取り集約型エンティティには、2次キャッシュを慎重に検討。退避戦略を検証
マイグレーション
- FlywayまたはLiquibaseを使用。本番環境でHibernate自動DDLに依存しない
- マイグレーションを冪等かつ追加的に保つ。計画なしに列を削除しない
データアクセステスト
- 本番環境を反映するために、Testcontainersを使用した
@DataJpaTestを優先 - ログを使用してSQL効率をアサート: パラメータ値には
logging.level.org.hibernate.SQL=DEBUGとlogging.level.org.hibernate.orm.jdbc.bind=TRACEを設定
注意: エンティティを軽量に保ち、クエリを意図的にし、トランザクションを短く保ちます。フェッチ戦略とプロジェクションでN+1を防ぎ、読み取り/書き込みパスにインデックスを作成します。


