Quand ils apparaissent sur un champ / getter d'un
@Entity
, quelle est la différence entre eux? (Je persiste l'entité à travers Hibernate ).À quel cadre et / ou spécification chacun d'eux appartient-il?
@NotNull
est situé à l'intérieurjavax.validation.constraints
. Dans lejavax.validation.constraints.NotNull
javadoc, il est ditL'élément annoté ne doit pas être nul
mais il ne parle pas de la représentation de l'élément dans la base de données, alors pourquoi ajouter la contrainte
nullable=false
à la colonne?
242
@NotNull
,@Size
,@Min
,@Max
, etc., et les traduire en contraintes de base de données.Les versions les plus récentes du fournisseur JPA hibernate appliquent les contraintes de validation du bean (JSR 303) comme
@NotNull
DDL par défaut (grâce auxhibernate.validator.apply_to_ddl property
valeurs par défaut detrue
). Mais il n'y a aucune garantie que d'autres fournisseurs JPA le fassent ou aient même la capacité de le faire.Vous devez utiliser des annotations de validation de bean, comme
@NotNull
pour vous assurer que les propriétés du bean sont définies sur une valeur non nulle, lors de la validation des beans java dans la JVM (cela n'a rien à voir avec les contraintes de base de données, mais dans la plupart des situations doit leur correspondre).Vous devez en outre utiliser l'annotation JPA comme
@Column(nullable = false)
pour donner au fournisseur jpa des conseils pour générer la bonne DDL pour la création de colonnes de table avec les contraintes de base de données souhaitées. Si vous pouvez ou souhaitez compter sur un fournisseur JPA comme Hibernate, qui applique les contraintes de validation du bean à DDL par défaut, vous pouvez les omettre.la source
Il est intéressant de noter que toutes les sources soulignent que @Column (nullable = false) est utilisé uniquement pour la génération DDL.
Cependant, même s'il n'y a pas d'annotation @NotNull et que l'option hibernate.check_nullability est définie sur true, Hibernate effectuera la validation des entités à conserver.
Il lèvera PropertyValueException en disant que "la propriété non nulle fait référence à une valeur nulle ou transitoire", si les attributs nullable = false n'ont pas de valeurs, même si de telles restrictions ne sont pas implémentées dans la couche de base de données.
Plus d'informations sur l'option hibernate.check_nullability sont disponibles ici: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping .
la source
L'
@Column
annotation JPAL'
nullable
attribut de l'@Column
annotation a deux objectifs:Outil de génération de schéma
L'outil de génération de schéma HBM2DDL traduit l'
@Column(nullable = false)
attribut d'entité en uneNOT NULL
contrainte pour la colonne de table associée lors de la génération de l'CREATE TABLE
instruction.Rinçage du contexte de persistance
Lors du vidage du contexte de persistance, Hibernate ORM utilise également l'
@Column(nullable = false)
attribut d'entité:Si la validation échoue, Hibernate lance un
PropertyValueException
et empêche l'exécution forcée de l'instruction INSERT ou UPDATE:L'
@NotNull
annotation de validation du beanL'
@NotNull
annotation est définie par Bean Validation et, tout comme Hibernate ORM est l'implémentation JPA la plus populaire, l'implémentation Bean Validation la plus populaire est le framework Hibernate Validator .Lorsque vous utilisez Hibernate Validator avec Hibernate ORM, Hibernate Validator lance un
ConstraintViolation
lors de la validation de l'entité.la source