-
Когда они появляются на поле/получателе с
@Entity
, в чем разница между ними? (Я сохраняю Entity через Hibernate). -
Какая структура и/или спецификация каждого из них принадлежит?
-
@NotNull
находится в пределахjavax.validation.constraints
. Вjavax.validation.constraints.NotNull
javadoc говорится:Аннотированный элемент не должен иметь значение null
но он не говорит о представлении элемента в базе данных, поэтому почему я должен добавить ограничение
nullable=false
в столбец?
Путаница: @NotNull vs @Column (nullable = false)
Ответ 1
@NotNull
является аннотацией JSR 303 Bean Validation. Он не имеет ничего общего с ограничениями базы данных. Однако, поскольку Hibernate является эталонной реализацией JSR 303, он разумно подбирает эти ограничения и переводит их в ограничения базы данных для вас, поэтому вы получаете два по цене одного. @Column(nullable = false)
- способ JPA объявить столбец непустым. То есть первый предназначен для проверки, а второй - для указания деталей схемы базы данных. Вы просто получаете дополнительную (и приветствуете!) Помощь из Hibernate в аннотации проверки.
Ответ 2
Самые последние версии провайдера hibernate JPA по умолчанию применяют ограничения проверки w810 (JSR 303), такие как @NotNull
, к DDL (благодаря hibernate.validator.apply_to_ddl property
по умолчанию true
). Но нет никакой гарантии, что другие поставщики JPA имеют или даже имеют возможность сделать это.
Вы должны использовать bean аннотации проверки, такие как @NotNull
, чтобы гарантировать, что свойства bean имеют значение null-null при проверке java beans в JVM (это не имеет ничего общего с ограничениями базы данных, но в большинстве ситуаций они должны соответствовать).
Вы также должны использовать аннотацию JPA, например @Column(nullable = false)
, чтобы дать подсказкам провайдера jpa создать правильный DDL для создания столбцов таблицы с необходимыми ограничениями базы данных. Если вы можете или хотите полагаться на поставщика JPA, такого как Hibernate, который по умолчанию использует ограничения проверки w810 для DDL, вы можете их опустить.
Ответ 3
Интересно отметить, что все источники подчеркивают, что @Column (nullable = false) используется только для генерации DDL.
Однако даже если аннотации @NotNull нет, а для параметра hibernate.check_nullability задано значение true, Hibernate выполнит проверку сущностей, которые будут сохранены.
Он вызовет PropertyValueException, сообщив, что "свойство not-null ссылается на нулевое или временное значение", если атрибуты nullable = false не имеют значений, даже если такие ограничения не реализованы на уровне базы данных.
Дополнительная информация о параметре hibernate.check_nullability доступна здесь: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping.