Optimize JPA/Hibernate: entity design, query performance, N+1 prevention, caching strategies
Optimize database access with proper entity design, query optimization, and caching.
@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;
}
// 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);