@Basic

@Basic обозначает обычное сохраняемое свойство. Для поддерживаемых простых типов аннотация подразумевается, поэтому её редко пишут явно.

@Basic(optional = false)
@Column(nullable = false)
private String title;

Параметры

  • optional=false выражает требование JPA-модели для не-примитивного атрибута;
  • fetch=LAZY — только подсказка для basic-поля и без bytecode enhancement часто не даёт настоящей ленивой загрузки.

optional=false не заменяет NOT NULL в БД и не равно Bean Validation @NotNull. Эти уровни дополняют друг друга:

  • JPA описывает маппинг;
  • валидация проверяет входную модель;
  • ограничение БД защищает данные при любом способе записи.

Large Object

Для большого текста или бинарных данных существует @Lob, но хранение крупных объектов в основной таблице влияет на чтение и резервное копирование. Выбор между БД и объектным хранилищем — архитектурное решение, а не только аннотация.

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

  1. Обязательна ли @Basic? Нет, для обычного поля она подразумевается.
  2. Гарантирует ли fetch=LAZY отложенную загрузку? Нет, для basic-полей это подсказка и зависит от enhancement.
  3. Равны ли optional=false и nullable=false? Нет: первое относится к JPA-модели, второе описывает столбец.
  4. Почему нужен NOT NULL в БД? Запись может происходить в обход текущего приложения.

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