Настройка Hibernate ORM для Java веб-застосунку
Hibernate — реалізація JPA-специфікації з багатим набором розширень. У сучасних Spring Boot 3.x проектах Hibernate 6.x використовується через Spring Data JPA, але розуміння шару Hibernate необхідне для тонкої настройки продуктивності, кастомних типів та складних маппінгів.
Залежності (Maven)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
Конфігурація
spring:
jpa:
database-platform: org.hibernate.dialect.PostgreSQLDialect
hibernate:
ddl-auto: validate
properties:
hibernate:
jdbc:
batch_size: 50
order_inserts: true
cache:
use_second_level_cache: true
region.factory_class: org.hibernate.cache.jcache.JCacheCacheRegionFactory
Сутність
@Entity
@Table(name = "products")
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(nullable = false, length = 500)
private String title;
@Column(unique = true, nullable = false)
private String slug;
@Enumerated(EnumType.STRING)
@Column(nullable = false)
private ProductStatus status = ProductStatus.DRAFT;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "category_id")
private Category category;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(
name = "product_tags",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private Set<Tag> tags = new HashSet<>();
@CreationTimestamp
@Column(name = "created_at", updatable = false)
private LocalDateTime createdAt;
}
Spring Data JPA Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
@Query("""
SELECT p FROM Product p
JOIN FETCH p.category
WHERE p.status = :status
ORDER BY p.createdAt DESC
""")
List<Product> findPublishedWithCategory(@Param("status") ProductStatus status);
@EntityGraph(attributePaths = {"category", "tags"})
List<Product> findByStatus(ProductStatus status);
}
Запобігання N+1
Використовуємо @EntityGraph або JOIN FETCH для запобігання N+1 запитам. Встановлюємо FetchType.LAZY на @ManyToOne — це критично для продуктивності.
@BatchSize(size = 20)
@ManyToMany
private Set<Tag> tags;
Flyway Міграції
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
Файли: V1__create_products.sql, V2__add_index.sql.
Терміни
Первісна настройка Spring Boot + Hibernate: 1–2 дні. Оптимізація продуктивності: 2–4 дні.







