
Jpa Patterns
Model and tune Spring Boot persistence with JPA entities, relationships, queries, and pool settings without N+1 surprises.
Overview
JPA Patterns is an agent skill for the Build phase that applies JPA and Hibernate entity, relationship, query, transaction, and pooling patterns in Spring Boot backends.
Install
npx skills add https://github.com/affaan-m/everything-claude-code --skill jpa-patternsWhat is this skill?
- Entity templates with indexes, auditing listeners, and soft-delete patterns
- Relationship mapping with explicit N+1 prevention and fetch strategies
- Query optimization via projections, pagination, and custom repository methods
- Transaction boundaries, auditing configuration, and second-level cache tuning
- HikariCP pooling guidance for production Spring Boot apps
Adoption & trust: 5.2k installs on skills.sh; 210k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You are wiring Spring Boot persistence but lack a consistent playbook for entities, relationships, and query performance.
Who is it for?
Solo builders implementing or refactoring a Spring Boot API with real relational data and Hibernate on the classpath.
Skip if: Teams on non-JVM stacks, raw SQL-only services without JPA, or greenfield projects that have not chosen Spring Boot yet.
When should I use this skill?
Designing JPA entities and table mappings, defining relationships, optimizing queries, configuring transactions or auditing, or tuning connection pooling in Spring Boot.
What do I get? / Deliverables
Your agent outputs aligned entity designs, repository methods, and tuning notes that reduce N+1 issues and standardize auditing and pagination.
- Entity and relationship class patterns
- Repository and query optimization guidance
- Auditing, pagination, and pool configuration notes
Recommended Skills
Journey fit
Persistence design and repository performance belong in Build when you are implementing the data layer of a JVM backend. Entities, Hibernate fetch plans, transactions, and HikariCP are core backend concerns, not frontend or launch work.
How it compares
Use for opinionated Spring JPA snippets instead of generic database docs that ignore Hibernate fetch and cascade behavior.
Common Questions / FAQ
Who is jpa-patterns for?
Indie and solo developers shipping Spring Boot backends who want agent-guided JPA entity and repository patterns.
When should I use jpa-patterns?
During Build backend work when designing entities, fixing N+1 queries, adding auditing or soft deletes, or tuning HikariCP and pagination.
Is jpa-patterns safe to install?
Review the Security Audits panel on this Prism page before installing; the skill guides code generation and does not declare its own audit pass/fail counts.
SKILL.md
READMESKILL.md - Jpa Patterns
# JPA/Hibernate Patterns Use for data modeling, repositories, and performance tuning in Spring Boot. ## When to Activate - Designing JPA entities and table mappings - Defining relationships (@OneToMany, @ManyToOne, @ManyToMany) - Optimizing queries (N+1 prevention, fetch strategies, projections) - Configuring transactions, auditing, or soft deletes - Setting up pagination, sorting, or custom repository methods - Tuning connection pooling (HikariCP) or second-level caching ## Entity Design ```java @Entity @Table(name = "markets", indexes = { @Index(name = "idx_markets_slug", columnList = "slug", unique = true) }) @EntityListeners(AuditingEntityListener.class) public class MarketEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false, length = 200) private String name; @Column(nullable = false, unique = true, length = 120) private String slug; @Enumerated(EnumType.STRING) private MarketStatus status = MarketStatus.ACTIVE; @CreatedDate private Instant createdAt; @LastModifiedDate private Instant updatedAt; } ``` Enable auditing: ```java @Configuration @EnableJpaAuditing class JpaConfig {} ``` ## Relationships and N+1 Prevention ```java @OneToMany(mappedBy = "market", cascade = CascadeType.ALL, orphanRemoval = true) private List<PositionEntity> positions = new ArrayList<>(); ``` - Default to lazy loading; use `JOIN FETCH` in queries when needed - Avoid `EAGER` on collections; use DTO projections for read paths ```java @Query("select m from MarketEntity m left join fetch m.positions where m.id = :id") Optional<MarketEntity> findWithPositions(@Param("id") Long id); ``` ## Repository Patterns ```java public interface MarketRepository extends JpaRepository<MarketEntity, Long> { Optional<MarketEntity> findBySlug(String slug); @Query("select m from MarketEntity m where m.status = :status") Page<MarketEntity> findByStatus(@Param("status") MarketStatus status, Pageable pageable); } ``` - Use projections for lightweight queries: ```java public interface MarketSummary { Long getId(); String getName(); MarketStatus getStatus(); } Page<MarketSummary> findAllBy(Pageable pageable); ``` ## Transactions - Annotate service methods with `@Transactional` - Use `@Transactional(readOnly = true)` for read paths to optimize - Choose propagation carefully; avoid long-running transactions ```java @Transactional public Market updateStatus(Long id, MarketStatus status) { MarketEntity entity = repo.findById(id) .orElseThrow(() -> new EntityNotFoundException("Market")); entity.setStatus(status); return Market.from(entity); } ``` ## Pagination ```java PageRequest page = PageRequest.of(pageNumber, pageSize, Sort.by("createdAt").descending()); Page<MarketEntity> markets = repo.findByStatus(MarketStatus.ACTIVE, page); ``` For cursor-like pagination, include `id > :lastId` in JPQL with ordering. ## Indexing and Performance - Add indexes for common filters (`status`, `slug`, foreign keys) - Use composite indexes matching query patterns (`status, created_at`) - Avoid `select *`; project only needed columns - Batch writes with `saveAll` and `hibernate.jdbc.batch_size` ## Connection Pooling (HikariCP) Recommended properties: ``` spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.validation-timeout=5000 ``` For PostgreSQL LOB handling, add: ``` spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true ``` ## Caching - 1st-level cache is per EntityManager; avoid keeping entities across transactions - For read-heavy entities, consider second-level cache cautiously; validate eviction strategy ## Migrations - Use Flyway or Li