Hack23

jpa-hibernate-optimization

Optimize JPA/Hibernate: entity design, query performance, N+1 prevention, caching strategies

Hack23 236 56 Updated 7mo ago
GitHub

Install

npx skillscat add hack23/cia/jpa-hibernate-optimization

Install via the SkillsCat registry.

SKILL.md

JPA/Hibernate Optimization Skill

Purpose

Optimize database access with proper entity design, query optimization, and caching.

When to Use

  • ✅ Designing entity relationships
  • ✅ Optimizing slow queries
  • ✅ Preventing N+1 queries
  • ✅ Implementing caching

Entity Optimization

@Entity
@Table(name = "politician", indexes = {
    @Index(name = "idx_politician_party", columnList = "party"),
    @Index(name = "idx_politician_district", columnList = "district")
})
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Politician {
    @Id
    private String id;
    
    @Column(name = "first_name", nullable = false, length = 50)
    private String firstName;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "party_id")
    private Party party;
    
    @OneToMany(mappedBy = "politician", cascade = CascadeType.ALL, orphanRemoval = true)
    @BatchSize(size = 20)
    private List<VotingRecord> votingRecords;
}

Query Optimization

// Use JOIN FETCH to prevent N+1
@Query("SELECT p FROM Politician p JOIN FETCH p.party WHERE p.district = :district")
List<Politician> findByDistrictWithParty(@Param("district") String district);

// Use DTOs for read-only queries
@Query("SELECT new com.hack23.cia.dto.PoliticianSummary(p.id, p.firstName, p.lastName) " +
       "FROM Politician p WHERE p.active = true")
List<PoliticianSummary> findActivePoliticiansSummary();

// Pagination for large result sets
Page<Politician> findByParty(String party, Pageable pageable);

Second-Level Cache

spring:
  jpa:
    properties:
      hibernate:
        cache:
          use_second_level_cache: true
          region:
            factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
        javax:
          cache:
            provider: org.ehcache.jsr107.EhcacheCachingProvider

References