spring-data-jpa について
Spring Data JPAで永続化レイヤーを構築するためのスキルです。エンティティ、リポジトリ、クエリ、設定、トランザクションを扱い、ページングや監査、よくあるフェッチ問題への対処も案内します。
主な機能
- 01JPAエンティティと関連の定義
- 02Spring Dataリポジトリの作成
- 03派生クエリ、JPQL、ネイティブクエリの記述
- 04データソースとトランザクションの設定
- 05ページング、ソート、エンティティグラフの利用
活用シーン
- 01Springアプリケーションのデータアクセス実装
- 02ページングや独自リポジトリクエリの追加
- 03トランザクション境界とフェッチ戦略の確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill spring-data-jpaインストール後、Claude Code で/spring-data-jpaを入力して読み込まれたか確認します。
同梱ファイルLICENSE.txt
詳細
このスキルを使用するタイミング
次のことをユーザーが希望する場合は、いつでもこのスキルを使用します。
- アノテーション(@Entity、@Id、@Column)を使用して JPA エンティティを定義する
- Spring Data リポジトリ(JpaRepository、CrudRepository)を作成する
- 派生クエリメソッド、JPQL/ネイティブ SQL を使った @Query、Specifications を使用する
- データソース、Hibernate の方言、トランザクション管理を設定する
- ページネーション、ソート、監査、エンティティグラフを扱う
このスキルの使用方法
ワークフロー
- JPA アノテーションとリレーションシップのマッピングを使用してエンティティを定義します
- 派生クエリメソッドまたはカスタムクエリメソッドを備えた JpaRepository を拡張して、リポジトリを作成します
application.ymlまたはapplication.propertiesでデータソースを設定します- 適切なトランザクション境界を設定し、ビジネスロジックをカプセル化するためにサービスを使用します
1. エンティティの定義
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(unique = true, nullable = false)
private String email;
@CreatedDate
private LocalDateTime createdAt;
// Getters and setters
}
2. リポジトリ
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByEmail(String email);
List<User> findByNameContaining(String name);
Page<User> findByNameContaining(String name, Pageable pageable);
@Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmailCustom(@Param("email") String email);
}
3. トランザクションを使用したサービス
@Service
@Transactional
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User create(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
return userRepository.save(user);
}
@Transactional(readOnly = true)
public Page<User> search(String name, Pageable pageable) {
return userRepository.findByNameContaining(name, pageable);
}
}
4. 設定
spring:
datasource:
url: jdbc:postgresql://localhost:5432/mydb
username: postgres
password: password
jpa:
hibernate:
ddl-auto: validate
show-sql: false
properties:
hibernate.format_sql: true
ベストプラクティス
- N+1 クエリ問題に注意し、フェッチ戦略を制御するには
@EntityGraphまたはJOIN FETCHを使用します - 大規模なデータセットには、ページネーション(
Pageable)とバッチ処理を使用します - エンティティと DTO を分離し、JPA エンティティを API レスポンスで直接公開しないでください
- トランザクション境界を明確に定義し、読み取り操作には
@Transactional(readOnly = true)を使用します - 本番環境で
ddl-auto: updateを使用する代わりに、スキーマのマイグレーションには Flyway または Liquibase を使用します
リソース
- 公式ドキュメント:https://spring.io/projects/spring-data-jpa
- リファレンスガイド:https://docs.spring.io/spring-data/jpa/reference/
キーワード
spring data jpa, JPA, Repository, entity, query methods, JPQL, pagination, transactions, Hibernate, Spring Boot, persistence
コメント
Markdown 対応