@Entity и маппинг
Тема дорожной карты · Java
ORM-маппинг с JPA (Java Persistence API) — стандартный подход в Java для соединения объектно-ориентированных доменных моделей с реляционными базами данных, использующий метаданные аннотаций для определения соответствия JVM-объектов SQL-таблицам без написанного вручную JDBC. Спецификация JPA (jakarta.persistence) определяет основные аннотации — @Entity, @Table, @Id, @GeneratedValue, @Column, @OneToMany, @ManyToOne, @ManyToMany, @JoinColumn и @MappedSuperclass, — которые Hibernate, доминирующий JPA-провайдер, транслирует в DDL и DML во время выполнения. ORM-маппинг с JPA управляет жизненными циклами объектов через EntityManager и EntityManagerFactory, поддерживая запросы JPQL и Criteria API, стратегии ленивой/жадной загрузки, каскадные операции и границы @Transactional, подключённые инфраструктурой управления транзакциями Spring. Hibernate расширяет спецификацию JPA собственными аннотациями (@NaturalId, @BatchSize, @Fetch, @Cache) и кэшем второго уровня (EhCache, Caffeine), значительно сокращающим обращения к базе данных в читальне-интенсивных Spring Boot-приложениях. Владение ORM-маппингом с JPA незаменимо для Java бэкенд-разработчиков, работающих с репозиториями Spring Data JPA, миграциями схем Flyway/Liquibase и слоями персистентности на основе JDBC, которые должны балансировать между производительностью разработчика и контролем над SQL-запросами.
Как это работает
@Entity и маппинг (Java Database Connectivity) — стандартный SQL-API: DriverManager.getConnection, PreparedStatement, ResultSet. Connection pooling (HikariCP — де факто) обязателен в production. Higher-level абстракции: JPA / Hibernate (ORM), Spring Data JPA, jOOQ (type-safe SQL DSL), MyBatis (mapper-based). Для Spring Boot — Spring Data JPA + Flyway/Liquibase для миграций (конвенциональный стек).
Когда применять
Всегда PreparedStatement с параметрами (?) — никогда не конкатенируйте SQL с user-input. HikariCP для pool (разумнее defaults, чем DBCP). JPA/Hibernate — для CRUD-heavy приложений, где ORM экономит время; jOOQ — когда SQL должен быть first-class. Миграции схемы всегда через тул (Flyway, Liquibase); никогда руками в prod.
Типичные ошибки
Ловушки @Entity и маппинг: SQL-инъекция из конкатенации ("я же доверяю input" — пока не доверяете); утечки соединений (всегда try-with-resources или контейнер-managed); N+1 запросов от наивного Hibernate (eager-load явно через JOIN FETCH); медленный старт из-за Hibernate-metamodel + прогрев pool (прогревайте в CI/тестах).