Путаница: @NotNull против @Column (nullable = false) - PullRequest
217 голосов
/ 16 сентября 2011
  1. Когда они появляются на поле / получателе @Entity, в чем разница между ними? (Я сохраняю сущность через Hibernate ).

  2. К какой структуре и / или спецификации принадлежит каждый из них?

  3. @NotNull находится в пределах javax.validation.constraints. В javax.validation.constraints.NotNull Javadoc написано

    Аннотированный элемент не должен быть нулевым

    но это не говорит о представлении элемента в базе данных, так зачем мне добавлять ограничение nullable=false к столбцу?

Ответы [ 3 ]

297 голосов
/ 16 сентября 2011

@NotNull является аннотацией JSR 303 Bean . Это не имеет ничего общего с ограничениями базы данных. Однако, поскольку Hibernate является эталонной реализацией JSR 303, он разумно распознает эти ограничения и преобразует их в ограничения базы данных, поэтому вы получаете два по цене одного. @Column(nullable = false) - это способ JPA объявить столбец ненулевым. То есть первый предназначен для проверки, а второй - для указания деталей схемы базы данных. Вы просто получаете дополнительную (и добро пожаловать!) Помощь от Hibernate для аннотаций проверки.

12 голосов
/ 27 февраля 2017

В последних версиях провайдера JPA hibernate по умолчанию применяются ограничения проверки компонентов (JSR 303), например @NotNull к DDL (благодаря hibernate.validator.apply_to_ddl property по умолчанию true).Но нет никакой гарантии, что другие провайдеры JPA сделают или даже смогут это сделать.

Вы должны использовать аннотации проверки bean-компонентов, такие как @NotNull, чтобы убедиться, что для свойств bean-компонента задано непустое значение,при проверке Java-бинов в JVM (это не имеет ничего общего с ограничениями базы данных, но в большинстве случаев должно соответствовать им).

Вы должны дополнительно использовать аннотацию JPA, такую ​​как @Column(nullable = false), чтобы дать подсказки провайдеру jpaсоздать правильный DDL для создания столбцов таблицы с необходимыми ограничениями базы данных.Если вы можете или хотите положиться на поставщика JPA, такого как Hibernate, который по умолчанию применяет ограничения проверки bean-компонентов к DDL, то вы можете их опустить.

8 голосов
/ 21 февраля 2018

Интересно отметить, что все источники подчеркивают, что @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.

...