Основные аннотации Hibernate
Современный импорт — jakarta.persistence.*. В проектах до Spring Boot 3 часто встречается javax.persistence.*.
| Аннотация | Назначение |
|---|---|
@Entity | класс является JPA-сущностью |
@Table | имя таблицы, схема и декларативные ограничения |
@Id | идентификатор сущности |
@GeneratedValue | способ генерации идентификатора |
@Column | отображение простого свойства на столбец |
@Transient | свойство не сохраняется |
@Enumerated | хранение enum как числа или строки |
@Embedded / @Embeddable | составное значение в таблице владельца |
@OneToOne | связь один к одному |
@OneToMany | связь один ко многим |
@ManyToOne | связь многие к одному |
@ManyToMany | связь через таблицу соединения |
@JoinColumn | столбец внешнего ключа |
@Version | версия для оптимистической блокировки |
Минимальный пример
@Entity
@Table(name = "customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Version
private long version;
@Column(nullable = false, length = 200)
private String name;
}Параметры вроде nullable, length и unique помогают генерации DDL и описывают намерение, но не заменяют управляемую миграцию схемы.
Вопросы для повторения
@Entityбез@Tableдопустима? Да, имя таблицы выводится по правилам провайдера и naming strategy.- Где ставить аннотации — на поле или getter? Это определяет стратегия доступа; смешивать без явного
@Accessопасно. @Column(nullable = false)проверяет объект до SQL? Не обязательно; надёжную валидацию задают отдельно, а БД должна иметьNOT NULL.- Зачем
@Version? Чтобы обнаружить конкурирующее изменение приUPDATEилиDELETE.
Связано: Маппинг Hibernate, Аннотация Access, LockModeType.