spring-data-jpa
Spring Data JPAを使用した永続化レイヤーの実装パターンを提供します。リポジトリの作成、エンティティのリレーション設定、派生クエリや`@Query`によるクエリ記述、ページネーション、データベース監査、トランザクション、UUID主キー、複数データベース構成、インデックス設定などを行う際に活用してください。
description の原文を見る
Provides patterns to implement persistence layers with Spring Data JPA. Use when creating repositories, configuring entity relationships, writing queries (derived and `@Query`), setting up pagination, database auditing, transactions, UUID primary keys, multiple databases, and database indexing.
SKILL.md 本文
Spring Data JPA
概要
Spring Data JPA リポジトリ、エンティティ関係、クエリ、ページネーション、監査、トランザクションのパターンを提供します。
使用する場合
CRUD操作を行うリポジトリ、エンティティ関係、@Queryアノテーション、ページネーション、監査、またはUUID主キーを作成する場合。
手順
リポジトリインターフェースの作成
リポジトリインターフェースを実装するには:
-
適切なリポジトリインターフェースを拡張します:
@Repository public interface UserRepository extends JpaRepository<User, Long> { // Custom methods defined here } -
シンプルな条件には派生クエリを使用します:
Optional<User> findByEmail(String email); List<User> findByStatusOrderByCreatedDateDesc(String status); -
@Queryでカスタムクエリを実装します:@Query("SELECT u FROM User u WHERE u.status = :status") List<User> findActiveUsers(@Param("status") String status);
エンティティの構成
-
適切なアノテーションでエンティティを定義します:
@Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, length = 100) private String email; } -
適切なカスケードタイプを使用して関係を構成します:
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Order> orders = new ArrayList<>();検証: 本番環境データに適用する前に、小規模なデータセットでカスケード動作をテストしてください。削除操作が予期せずカスケードしないことを確認してください。
-
データベース監査を設定します:
@CreatedDate @Column(nullable = false, updatable = false) private LocalDateTime createdDate;
クエリパターンの適用
- シンプルな条件には派生クエリを使用します
- 複雑なクエリには
@Queryを使用します - 単一の結果には
Optional<T>を返します - ページネーションには
Pageableを使用します - 更新/削除操作には
@Modifyingを適用します
トランザクションの管理
- 読み取り専用操作に
@Transactional(readOnly = true)をマークします - 変更操作には明示的なトランザクション境界を使用します
- 必要に応じてロールバック条件を指定します
検証と最適化
1. エンティティ構成を検証します:
- 本番環境へのデプロイ前にトランザクション内でカスケード動作をテストしてください
- 双方向関係が正しく同期することを検証してください
2. クエリのパフォーマンスを最適化します:
- 大規模なテーブルに対するクエリで
EXPLAIN ANALYZEを実行してください - パフォーマンスの問題が検出された場合: インデックスを追加 → EXPLAINで検証 → 繰り返し
@EntityGraphを使用してN+1クエリを防ぎます
3. ページネーションを検証します:
- インデックス付きの列がページネーションクエリをサポートしていることを確認してください
- 大規模なデータセットでテストして、カーソルの安定性を検証してください
例
基本的なCRUDリポジトリ
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Derived query
List<Product> findByCategory(String category);
// Custom query
@Query("SELECT p FROM Product p WHERE p.price > :minPrice")
List<Product> findExpensiveProducts(@Param("minPrice") BigDecimal minPrice);
}
ページネーション実装
@Service
public class ProductService {
private final ProductRepository repository;
public Page<Product> getProducts(int page, int size) {
Pageable pageable = PageRequest.of(page, size, Sort.by("name").ascending());
return repository.findAll(pageable);
}
}
監査機能付きエンティティ
@Entity
@EntityListeners(AuditingEntityListener.class)
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
@CreatedBy
@Column(nullable = false, updatable = false)
private String createdBy;
}
ベストプラクティス
エンティティ設計
- コンストラクタインジェクションのみを使用してください (フィールドインジェクションは絶対に使用しないでください)
final修飾子を使用した不変フィールドを選択してください- DTOには Java records (16+) または
@Valueを使用してください - 常に適切な
@Idおよび@GeneratedValueアノテーションを提供してください - 明示的な
@Tableおよび@Columnアノテーションを使用してください
パフォーマンス最適化
- 適切なフェッチ戦略を使用してください (LAZY vs EAGER)
- 大規模なデータセットにはページネーションを実装してください
- よくクエリされるフィールドにデータベースインデックスを使用してください
- N+1クエリ問題を避けるために
@EntityGraphの使用を検討してください
リファレンスドキュメント
包括的な例、詳細なパターン、高度な構成については、以下を参照してください:
Examples- 一般的なシナリオの完全なコード例Reference- 詳細なパターンと高度な構成
制約と警告
- JPA エンティティを REST API に直接公開しないでください。遅延ロードの問題を防ぐため、常に DTO を使用してください。
@EntityGraphまたはJOIN FETCHをクエリで使用して N+1 クエリ問題を回避してください。- 大規模なコレクションで
CascadeType.REMOVEを使用する場合は注意してください。パフォーマンスの問題を引き起こす可能性があります。 - コレクションに
EAGERフェッチタイプを使用しないでください。過度なデータベースクエリを引き起こす可能性があります。 - 長時間実行トランザクションは回避してください。データベースロック競合を引き起こす可能性があります。
- 読み取り操作には
@Transactional(readOnly = true)を使用して、最適化を有効にしてください。 - ファーストレベルキャッシュに注意してください。エンティティは同じトランザクション内でデータベースの変更を反映しない可能性があります。
- UUID 主キーはインデックスの断片化を引き起こす可能性があります。シーケンシャル UUID または Long ID の使用を検討してください。
- 大規模なデータセットのページネーションには、フルテーブルスキャンを避けるため適切なインデックスが必要です。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- giuseppe-trisciuoglio
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT
関連スキル
hugging-face-trackio
Trackioを使用してMLトレーニング実験を追跡・可視化できます。トレーニング中のメトリクスログ記録(Python API)、トレーニング診断のアラート発火、ログされたメトリクスの取得・分析(CLI)が必要な場合に活用してください。リアルタイムダッシュボード表示、Webhookを使用したアラート、HF Space同期、自動化向けのJSON出力に対応しています。
btc-bottom-model
ビットコインのサイクルタイミングモデルで、加重スコアリングシステムを搭載しています。日次パルス(4指標、32ポイント)とウィークリー構造(9指標、68ポイント)の2カテゴリーにわたる13の指標を追跡し、0~100のマーケットヒートスコアを算出します。ETFフロー、ファンディングレート、ロング/ショート比率、恐怖・貪欲指数、LTH-MVRV、NUPL、SOPR(LTH+STH)、LTH供給率、移動平均倍率(365日MA、200週MA)、週次RSI、出来高トレンドに対応します。市場サイクル全体を通じて買いと売りの両方の推奨を提供します。ビットコインの底値拾い、BTCサイクルポジション、買い時・売り時、オンチェーン指標、MVRV、NUPL、SOPR、LTH動向、ETFの流出入、ファンディングレート、恐怖指数、ビットコインが過熱状態か、マイナーコスト、暗号資産市場のセンチメント、BTCのポジションサイジング、「今ビットコインを買うべきか」「BTCが天井をつけているか」「オンチェーン指標は何を示しているか」といった質問の際にこのスキルを活用します。
protein_solubility_optimization
タンパク質の溶解性最適化 - タンパク質の溶解性を最適化します。タンパク質の特性を計算し、溶解性と親水性を予測し、有効な変異を提案します。タンパク質配列の特性計算、タンパク質機能の予測、親水性計算、ゼロショット配列予測を含むタンパク質エンジニアリング業務に使用できます。3つのSCPサーバーから4つのツールを統合しています。
research-lookup
Parallel Chat APIまたはPerplexity sonar-pro-searchを使用して、最新の研究情報を検索できます。学術論文の検索にも対応しています。クエリは自動的に最適なバックエンドにルーティングされるため、論文の検索、研究データの収集、科学情報の検証に活用できます。
tree-formatting
ggtree(R)またはiTOL(ウェブ)を使用して、系統樹の可視化とフォーマットを行います。系統樹を図として描画する際、ツリーレイアウトの選択、分類学に基づく枝やラベルの色付け、クレードの折りたたみ、サポート値の表示、またはツリーへのオーバーレイ追加が必要な場合に使用してください。系統推定(protein-phylogenyスキルを使用)やドメイン注釈(今後の独立したスキル)には使用しないでください。
querying-indonesian-gov-data
インドネシア政府の50以上のAPIとデータソースに接続できます。BPJPH(ハラール認証)、BOM(食品安全)、OJK(金融適正性)、BPS(統計)、BMKG(気象・地震)、インドネシア中央銀行(為替レート)、IDX(株式)、CKAN公開データポータル、pasal.id(第三者法MCP)に対応しています。インドネシア政府データを活用したアプリ開発、.go.idウェブサイトのスクレイピング、ハラール認証の確認、企業の法的適正性の検証、金融機関ステータスの照会、またはインドネシアMCPサーバーへの接続時に使用できます。CSRF処理、CKAN API使用方法、IP制限回避など、すぐに実行可能なPythonパターンを含んでいます。