Hibernate / Hibernate 7 Basics Interview Questions
What is @BatchSize and how does it solve the N+1 problem differently from JOIN FETCH?
@BatchSize loads lazy-loaded collections or proxies in batches using IN clauses rather than one-by-one. Unlike JOIN FETCH it works correctly with pagination.
@Entity public class Customer { @Id private Long id; private String name; @OneToMany(mappedBy="customer", fetch=FetchType.LAZY) @BatchSize(size=25) // load 25 collections at once private List<Order> orders; } // Without @BatchSize: // 1 query: SELECT * FROM customers LIMIT 100 // 100 queries: SELECT * FROM orders WHERE customer_id=1 ... customer_id=100 // Total: 101 queries // With @BatchSize(size=25): // 1 query: SELECT * FROM customers LIMIT 100 // 4 queries: SELECT * FROM orders WHERE customer_id IN (1..25) // SELECT * FROM orders WHERE customer_id IN (26..50) // SELECT * FROM orders WHERE customer_id IN (51..75) // SELECT * FROM orders WHERE customer_id IN (76..100) // Total: 5 queries! // Global default: # spring.jpa.properties.hibernate.default_batch_fetch_size=100 // @BatchSize on entity for proxy loading: @Entity @BatchSize(size=20) public class Product { ... }
More Related questions...