Spring Boot Data Access
Priority: P0
Configure JPA and Spring Data
- Read-Only: Default to
@Transactional(readOnly = true)on Services to optimize DB resources. - Projections: Use
Java Recordsfor Read-Only query results. Avoid fetching full@Entityobjects when not necessary. - Pagination: ALWAYS use
PageableandSlice(orPage) to prevent loading massive datasets. - Spring Data: Prefer
JpaRepositoryandQuery methods. Use@Querywith JPQL for complex logic. Use Flyway or Liquibase for migrations; never useddl-auto=createin production.
See implementation examples for repository projections, EntityGraph, and transactional patterns.
Optimize Queries and Transactions
- N+1 Problem: Fix
N+1selects usingJOIN FETCH(JPQL) or@EntityGraph. - Open-In-View: Set
spring.jpa.open-in-view=falseinapplication.yaml. - Bulk Operations: Use
@Modifyingwith@Queryfor updates/deletes to bypass EntityManager overhead. - Connection Pool: Configure
HikariCPwith explicitmaximum-pool-size. Tune Hikari pool-size based on expected concurrent queries.
Anti-Patterns
- No N+1 Selects: Use
JOIN FETCHor@EntityGraphinstead of lazy-loading in loops. - Entity Inflation: Don't use
@Data(Lombok) on Entities as it breaks Proxy andhashCode/equalsperformance. - Transactional Leak: Don't put
@Transactionalon publicRepositorymethods if theServiceis already transactional. - Raw SQL: Avoid native SQL unless JPQL/Criteria API is insufficient.