@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, но хранение крупных объектов в основной таблице влияет на чтение и резервное копирование. Выбор между БД и объектным хранилищем — архитектурное решение, а не только аннотация.
Вопросы для повторения
- Обязательна ли
@Basic? Нет, для обычного поля она подразумевается. - Гарантирует ли
fetch=LAZYотложенную загрузку? Нет, для basic-полей это подсказка и зависит от enhancement. - Равны ли
optional=falseиnullable=false? Нет: первое относится к JPA-модели, второе описывает столбец. - Почему нужен
NOT NULLв БД? Запись может происходить в обход текущего приложения.
Связано: Аннотация Column, Маппинг Hibernate.