Путаница: @NotNull vs @Column (nullable = false)

  • Когда они появляются на поле/получателе с @Entity, в чем разница между ними? (Я сохраняю Entity через Hibernate).

  • Какая структура и/или спецификация каждого из них принадлежит?

  • @NotNull находится в пределах javax.validation.constraints. В javax.validation.constraints.NotNull javadoc говорится:

    Аннотированный элемент не должен иметь значение null

    но он не говорит о представлении элемента в базе данных, поэтому почему я должен добавить ограничение 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.