Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
affaan-m avatar

Jpa Patterns

  • 1.4k installs
  • 238k repo stars
  • Updated August 5, 2026
  • affaan-m/ecc

This is a copy of jpa-patterns by affaan-m - installs and ranking accrue to the original listing.

JPA Patterns is an agent skill that provides battle-tested JPA and Hibernate patterns for entity design, relationship mapping, query optimization, and high-performance Spring Boot data layers.

About

JPA Patterns is an ECC-origin skill from affaan-m/ecc covering JPA and Hibernate work in Spring Boot applications. The skill activates when designing entities and table mappings, defining @OneToMany, @ManyToOne, and @ManyToMany relationships, optimizing queries with fetch strategies and projections to prevent N+1 problems, configuring transactions and auditing, implementing soft deletes, setting up pagination and custom repository methods, and tuning HikariCP connection pooling or second-level caching. Developers reach for JPA Patterns when scaffolding persistence layers or debugging slow Hibernate queries in production services. It consolidates entity design, relationship cardinality, indexing, and pooling guidance into one agent reference instead of scattered Stack Overflow threads.

  • Entity design with proper indexing, auditing, and soft-delete patterns
  • Relationship mapping for @OneToMany, @ManyToOne, @ManyToMany with N+1 prevention strategies
  • Query optimization using fetch strategies, projections, and custom repository methods
  • Transaction management, pagination, sorting, and connection pooling with HikariCP
  • Second-level caching and auditing configuration ready for production use

Jpa Patterns by the numbers

  • 1,394 all-time installs (skills.sh)
  • +86 installs in the week ending Aug 5, 2026 (Skillselion tracking)
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/affaan-m/ecc --skill jpa-patterns

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1.4k
repo stars238k
Last updatedAugust 5, 2026
Repositoryaffaan-m/ecc

How do you prevent N+1 queries in Hibernate?

Get battle-tested JPA and Hibernate patterns for clean entity design, efficient relationships, and high-performance Spring Boot data layers.

Who is it for?

Spring Boot backend developers designing JPA entities, repositories, or fixing Hibernate N+1 and pagination issues.

Skip if: Teams on jOOQ or raw JDBC stacks without JPA/Hibernate in the Spring Boot persistence layer.

When should I use this skill?

The user designs JPA entities, maps @OneToMany relationships, tunes HikariCP, or asks about Hibernate query optimization.

What you get

Entity mappings with correct relationships, optimized fetch strategies, transaction and audit config, and tuned HikariCP pool settings.

  • Entity class mappings
  • Optimized repository queries
  • Transaction and pool configuration

Files

SKILL.mdMarkdownGitHub ↗

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

@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:

@Configuration
@EnableJpaAuditing
class JpaConfig {}

Relationships and N+1 Prevention

@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
@Query("select distinct m from MarketEntity m left join fetch m.positions where m.id = :id")
Optional<MarketEntity> findWithPositions(@Param("id") Long id);
Note: DISTINCT is required when fetch-joining a one-to-many collection — without it, the root entity is duplicated once per child row in the result set. For single-result queries (findById) the duplication is harmless, but for list queries it produces duplicate root objects. Hibernate 6+ applies de-duplication automatically in some cases, but explicit DISTINCT keeps behavior portable and clear.

Repository Patterns

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:
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
@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

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 Liquibase; never rely on Hibernate auto DDL in production
  • Keep migrations idempotent and additive; avoid dropping columns without plan

Testing Data Access

  • Prefer @DataJpaTest with Testcontainers to mirror production
  • Assert SQL efficiency using logs: set logging.level.org.hibernate.SQL=DEBUG and logging.level.org.hibernate.orm.jdbc.bind=TRACE for parameter values

Remember: Keep entities lean, queries intentional, and transactions short. Prevent N+1 with fetch strategies and projections, and index for your read/write paths.

Related skills

How it compares

Use JPA Patterns for Spring Boot ORM design; skip it when the persistence layer is non-JPA SQL or NoSQL drivers.

FAQ

When should developers activate JPA Patterns?

JPA Patterns activates when designing JPA entities and table mappings, defining relationships, optimizing Hibernate queries, configuring transactions or auditing, setting up pagination, or tuning HikariCP pooling and second-level caching in Spring Boot.

What relationship annotations does JPA Patterns cover?

JPA Patterns documents @OneToMany, @ManyToOne, and @ManyToMany mappings along with fetch strategies and projections to avoid N+1 query problems in Spring Boot Hibernate repositories.

Backend & APIsbackendintegrations

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.