Jpa сущность

Тема дорожной карты · Spring Boot

JPA-сущности — это Java-классы, аннотированные @Entity, представляющие строки в таблице реляционной базы данных и формирующие слой объектно-реляционного маппинга, используемый Hibernate и Spring Data JPA в Spring Boot-приложениях. JPA-сущность требует поля первичного ключа, аннотированного @Id и опционально @GeneratedValue(strategy = GenerationType.IDENTITY) для автоинкремента; имя класса по умолчанию маппируется на имя таблицы, которое можно переопределить через @Table(name = "custom_table"). Маппинг столбцов управляется через @Column(name = "...", nullable = false, length = 255), а связи JPA-сущностей — «один ко многим», «многие к одному», «многие ко многим» — объявляются аннотациями @OneToMany, @ManyToOne и @ManyToMany, каждая с настраиваемыми FetchType и CascadeType. Hibernate как JPA-провайдер по умолчанию в Spring Boot генерирует DDL из определений JPA-сущностей, когда установлено spring.jpa.hibernate.ddl-auto=update или validate, тогда как для миграций схемы в продакшене рекомендуются Flyway или Liquibase. JPA-сущности должны соответствовать контракту JavaBean (публичный конструктор без аргументов, геттеры/сеттеры) и должны реализовывать equals() и hashCode() на основе бизнес-ключа или идентификатора базы данных для корректного поведения в кэшах Hibernate и Java-коллекциях.

Как это работает

Jpa сущность: Spring Data JPA оборачивает Hibernate (JPA-реализация). @Entity маппит Java-класс → DB-таблица; JpaRepository<T, ID> даёт CRUD + paging + sorting бесплатно. Method names типа findByEmailAndStatus парсятся в queries; сложные queries — @Query (JPQL или native SQL). Relations: @OneToMany, @ManyToOne, @ManyToMany — дефолтный fetch LAZY (one-to-many) или EAGER (many-to-one); знаменитая N+1 проблема прячется здесь. @Transactional оборачивает service-методы в DB-транзакцию.

Когда применять

Все relations LAZY по дефолту + JOIN FETCH или entity graphs для eager-загрузки только когда надо. Projections (DTO/interface) для read-only endpoints — пропускают Hibernate entity overhead. Мониторьте N+1 (Hibernate stats, p6spy или Datasource Proxy в тестах). Для heavy-read — raw JdbcTemplate или jOOQ — JPA отличен для CRUD, хуже для сложной аналитики.

Типичные ошибки

Ловушки Jpa сущность: N+1 queries (lazy loading в цикле); EAGER на каждом relation (огромные cascading joins); @Transactional на private/self-invocation (proxy не intercept-ит — аннотация ничего не делает); auto-DDL (spring.jpa.hibernate.ddl-auto=update) в prod (тихий + опасный schema drift).

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…