Путаница: @NotNull vs @Column(nullable = false)
, когда они появляются на поле/геттер из
@Entity
, в чем разница между ними? (Я сохраняю сущность через Hibernate).к какой структуре и/или спецификации принадлежит каждый из них?
-
@NotNull
находится вjavax.validation.constraints
. Вjavax.validation.constraints.NotNull
javadoc он говоританнотированный элемент не должен быть null
но он не говорит представления элемента в базе данных, так зачем мне добавлять ограничение
nullable=false
в столбце?
3 ответа:
@NotNull
это JSR 303 Bean Validation Примечание. Это не имеет ничего общего с самими ограничениями базы данных. Поскольку Hibernate является эталонной реализацией JSR 303, однако он разумно подбирает эти ограничения и переводит их в ограничения базы данных для вас, поэтому вы получаете два по цене одного.@Column(nullable = false)
это способ JPA объявления столбца не-null. То есть первый предназначен для валидации, а второй для указание деталей схемы базы данных. Вы просто получаете некоторые дополнительные (и добро пожаловать!) справка из спящего режима по аннотациям проверки.
самые последние версии Hibernate JPA provider применяет ограничения проверки bean (JSR 303), такие как
@NotNull
в DDL по умолчанию (благодаряhibernate.validator.apply_to_ddl property
по умолчаниюtrue
). Но нет никакой гарантии, что другие поставщики JPA делают или даже имеют возможность это сделать.вы должны использовать аннотации проверки бобов, такие как
@NotNull
чтобы гарантировать, что свойства bean имеют значение none-null, при проверке Java beans в JVM (это не имеет ничего общего с базой данных ограничения, но в большинстве ситуаций должны им соответствовать).вы должны дополнительно использовать аннотацию JPA как
@Column(nullable = false)
чтобы дать поставщику jpa подсказки для создания правильного DDL для создания столбцов таблицы с ограничениями базы данных, которые вы хотите. Если вы можете или хотите полагаться на поставщика JPA, такого как Hibernate, который по умолчанию применяет ограничения проверки бобов к DDL, вы можете их опустить.
интересно отметить, что все источники подчеркивают, что @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.