java-jpa-hibernate について
JPA、Hibernate、Spring Data を扱う Java 開発者向けのスキルガイドです。エンティティ設計、クエリ最適化、トランザクション、キャッシュ、永続化の問題調査を扱います。
主な機能
- 01JPA エンティティと関連マッピング
- 02Hibernate クエリ最適化
- 03Spring Data リポジトリとクエリ戦略
- 04トランザクションとロック設定
- 05キャッシュ戦略と永続化の問題調査
活用シーン
- 01エンティティ関連を持つ永続化モデルの設計
- 02N+1 クエリの特定と削減
- 03トランザクション、ロック、キャッシュの設定
- 04遅延ロードや接続問題の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pluginagentmarketplace/ custom-plugin-java --skill java-jpa-hibernateインストール後、Claude Code で/java-jpa-hibernateを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/config.yamlschema.jsonreferences/GUIDE.mdPATTERNS.mdscripts/validate.py詳細
Java JPA Hibernate スキル
本番アプリケーション向けに、JPA と Hibernate によるデータ永続化を習得します。
概要
このスキルでは、JPA エンティティの設計、Hibernate の最適化、Spring Data リポジトリ、クエリ戦略、キャッシュについて扱います。N+1 クエリを防ぎ、高性能な永続化レイヤーを構築することに重点を置いています。
このスキルを使う場面
次のような場合に使用します。
- リレーションを持つ JPA エンティティを設計する
- データベースクエリを最適化する
- パフォーマンスを考慮して Hibernate を設定する
- キャッシュ戦略を実装する
- 永続化に関する問題をデバッグする
対象トピック
エンティティ設計
- エンティティのマッピングアノテーション
- リレーションの種類(1:1、1:N、N:M)
- 継承戦略
- ライフサイクルコールバック
- 監査
クエリの最適化
- N+1 問題の防止
- JOIN FETCH と EntityGraph の比較
- バッチフェッチ
- プロジェクションと DTO
トランザクション
- @Transactional の設定
- 伝播と分離レベル
- 楽観的ロックと悲観的ロックの比較
- デッドロックの防止
キャッシュ
- 第 1 レベルキャッシュと第 2 レベルキャッシュ
- クエリキャッシュ
- キャッシュの無効化
- Redis との連携
クイックリファレンス
// Entity with relationships
@Entity
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
@BatchSize(size = 20)
private List<OrderItem> items = new ArrayList<>();
@Version
private Long version;
// Bidirectional helper
public void addItem(OrderItem item) {
items.add(item);
item.setOrder(this);
}
}
// Auditing base class
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {
@CreatedDate
@Column(updatable = false)
private Instant createdAt;
@LastModifiedDate
private Instant updatedAt;
}
// Repository with query optimization
public interface OrderRepository extends JpaRepository<Order, Long> {
// JOIN FETCH to prevent N+1
@Query("SELECT DISTINCT o FROM Order o JOIN FETCH o.items WHERE o.status = :status")
List<Order> findByStatusWithItems(@Param("status") Status status);
// EntityGraph alternative
@EntityGraph(attributePaths = {"items", "customer"})
Optional<Order> findById(Long id);
// DTO Projection
@Query("SELECT new com.example.OrderSummary(o.id, o.status, c.name) " +
"FROM Order o JOIN o.customer c WHERE o.id = :id")
Optional<OrderSummary> findSummaryById(@Param("id") Long id);
}
N+1 の防止策
| 戦略 | 使用する場面 | 例 |
|---|---|---|
| JOIN FETCH | リレーションが常に必要な場合 | JOIN FETCH o.items |
| EntityGraph | 動的にフェッチする場合 | @EntityGraph(attributePaths) |
| @BatchSize | コレクションにアクセスする場合 | @BatchSize(size = 20) |
| DTO Projection | 読み取り専用のクエリ | new OrderSummary(...) |
Hibernate の設定
spring:
jpa:
open-in-view: false # Critical!
properties:
hibernate:
jdbc.batch_size: 50
order_inserts: true
order_updates: true
default_batch_fetch_size: 20
generate_statistics: ${HIBERNATE_STATS:false}
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
leak-detection-threshold: 60000
トラブルシューティング
よくある問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| N+1 クエリ | ループ内での遅延読み込み | JOIN FETCH、EntityGraph |
| LazyInitException | セッションが閉じている | DTO プロジェクション |
| クエリが遅い | インデックスがない | EXPLAIN ANALYZE |
| 接続リーク | @Transactional がない | アノテーションを追加 |
デバッグ用プロパティ
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.orm.jdbc.bind=TRACE
hibernate.generate_statistics=true
デバッグチェックリスト
□ Enable SQL logging
□ Check query count per request
□ Verify fetch strategies
□ Review @Transactional
□ Check connection pool
使用方法
Skill("java-jpa-hibernate")
関連スキル
java-performance- クエリの最適化java-spring-boot- Spring Data
コメント
Markdown 対応