AgentSkillsCN

java-jpa-hibernate

精通 JPA/Hibernate——掌握实体设计、查询、事务处理与性能优化

SKILL.md
--- frontmatter
name: java-jpa-hibernate
description: Master JPA/Hibernate - entity design, queries, transactions, performance optimization
sasmp_version: "1.3.0"
version: "3.0.0"
bonded_agent: 06-java-persistence
bond_type: PRIMARY_BOND
allowed-tools: Read, Write, Bash, Glob, Grep

# Parameter Validation
parameters:
  database:
    type: string
    enum: [postgresql, mysql, oracle, h2]
    description: Target database
  focus:
    type: string
    enum: [entities, queries, transactions, caching]
    description: Topic focus area

Java JPA Hibernate Skill

Master data persistence with JPA and Hibernate for production applications.

Overview

This skill covers JPA entity design, Hibernate optimization, Spring Data repositories, query strategies, and caching. Targets Java 25, Spring Boot 4.0.x (Hibernate 7, Jakarta Persistence 3.2). Focuses on preventing N+1 queries and building high-performance persistence layers.

When to Use This Skill

Use when you need to:

  • Design JPA entities with relationships (Jakarta Persistence 3.2)
  • Optimize database queries with Hibernate 7
  • Configure Hibernate for performance on Spring Boot 4.0+
  • Implement caching strategies
  • Debug persistence issues

Project context: Java 25, Spring Boot 4.0.2, spring-boot-starter-data-jpa, Maven

Topics Covered

Entity Design

  • Entity mapping annotations
  • Relationship types (1:1, 1:N, N:M)
  • Inheritance strategies
  • Lifecycle callbacks
  • Auditing

Query Optimization

  • N+1 problem prevention
  • JOIN FETCH vs EntityGraph
  • Batch fetching
  • Projections and DTOs

Transactions

  • @Transactional configuration
  • Propagation and isolation
  • Optimistic vs pessimistic locking
  • Deadlock prevention

Caching

  • First and second level cache
  • Query cache
  • Cache invalidation
  • Redis integration

Quick Reference

java
// Entity with relationships
@Entity
@Table(name = "orders")
public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_id", nullable = false)
    private Customer customer;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true)
    @BatchSize(size = 20)
    private List<OrderItem> items = new ArrayList<>();

    @Version
    private Long version;

    // Bidirectional helper
    public void addItem(OrderItem item) {
        items.add(item);
        item.setOrder(this);
    }
}

// Auditing base class
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Auditable {
    @CreatedDate
    @Column(updatable = false)
    private Instant createdAt;

    @LastModifiedDate
    private Instant updatedAt;
}

// Repository with query optimization
public interface OrderRepository extends JpaRepository<Order, Long> {

    // JOIN FETCH to prevent N+1
    @Query("SELECT DISTINCT o FROM Order o JOIN FETCH o.items WHERE o.status = :status")
    List<Order> findByStatusWithItems(@Param("status") Status status);

    // EntityGraph alternative
    @EntityGraph(attributePaths = {"items", "customer"})
    Optional<Order> findById(Long id);

    // DTO Projection
    @Query("SELECT new com.example.OrderSummary(o.id, o.status, c.name) " +
           "FROM Order o JOIN o.customer c WHERE o.id = :id")
    Optional<OrderSummary> findSummaryById(@Param("id") Long id);
}

N+1 Prevention Strategies

StrategyUse WhenExample
JOIN FETCHAlways need relationJOIN FETCH o.items
EntityGraphDynamic fetching@EntityGraph(attributePaths)
@BatchSizeCollection access@BatchSize(size = 20)
DTO ProjectionRead-only queriesnew OrderSummary(...)

Hibernate Configuration

yaml
spring:
  jpa:
    open-in-view: false  # Critical!
    properties:
      hibernate:
        jdbc.batch_size: 50
        order_inserts: true
        order_updates: true
        default_batch_fetch_size: 20
        generate_statistics: ${HIBERNATE_STATS:false}

  datasource:
    hikari:
      maximum-pool-size: 20
      minimum-idle: 5
      leak-detection-threshold: 60000

Troubleshooting

Common Issues

ProblemCauseSolution
N+1 queriesLazy in loopJOIN FETCH, EntityGraph
LazyInitExceptionSession closedDTO projection
Slow queriesMissing indexEXPLAIN ANALYZE
Connection leakNo @TransactionalAdd annotation

Debug Properties

properties
spring.jpa.show-sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.orm.jdbc.bind=TRACE
hibernate.generate_statistics=true

Debug Checklist

code
□ Enable SQL logging
□ Check query count per request
□ Verify fetch strategies
□ Review @Transactional
□ Check connection pool

Usage

code
Skill("java-jpa-hibernate")

Related Skills

  • java-performance - Query optimization
  • java-spring-boot - Spring Data