Основные аннотации 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 и описывают намерение, но не заменяют управляемую миграцию схемы.

Вопросы для повторения

  1. @Entity без @Table допустима? Да, имя таблицы выводится по правилам провайдера и naming strategy.
  2. Где ставить аннотации — на поле или getter? Это определяет стратегия доступа; смешивать без явного @Access опасно.
  3. @Column(nullable = false) проверяет объект до SQL? Не обязательно; надёжную валидацию задают отдельно, а БД должна иметь NOT NULL.
  4. Зачем @Version? Чтобы обнаружить конкурирующее изменение при UPDATE или DELETE.

Связано: Маппинг Hibernate, Аннотация Access, LockModeType.