web-dev-qa-db-fra.com

Confusion: @NotNull vs @Column (nullable = false)

  1. Quand ils apparaissent sur un champ/getter d'un @Entity, quelle est la différence entre eux? (Je persiste l'entité à travers Hibernate).

  2. À quel cadre et/ou spécification chacun d'entre eux appartient-il?

  3. @NotNull est situé dans javax.validation.constraints. Dans le javax.validation.constraints.NotNull javadoc, il est indiqué

    L'élément annoté ne doit pas être null

    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?

219
rapt

@NotNull est une annotation validation de bean JSR 3 . Cela n'a rien à voir avec les contraintes de base de données elles-mêmes. Comme Hibernate est l’implémentation de référence de la JSR 303, il enregistre intelligemment ces contraintes et les traduit en contraintes de base de données. Vous en obtenez donc deux pour le prix d’un. @Column(nullable = false) est le moyen JPA de déclarer une colonne non nulle. C'est à dire. le premier est destiné à la validation et le second à l’indication des détails du schéma de base de données. Vous obtenez simplement une aide supplémentaire (et la bienvenue!) D'Hibernate sur les annotations de validation.

301
Ryan Stewart

Les versions les plus récentes du fournisseur JPA hibernate appliquent les contraintes de validation du bean (JSR 303) telles que @NotNull au DDL par défaut (grâce à hibernate.validator.apply_to_ddl property, par défaut à true). Mais rien ne garantit que les autres fournisseurs JPA ont ou ont même la capacité de le faire.

Vous devez utiliser des annotations de validation de bean telles que @NotNull pour vous assurer que les propriétés de bean sont définies sur une valeur null (null) lors de la validation de beans Java dans la machine virtuelle (cela n'a rien à voir avec les contraintes de base de données). mais dans la plupart des situations devrait correspondre à eux).

Vous devez également utiliser l'annotation JPA telle que @Column(nullable = false) pour donner au fournisseur jpa des astuces lui permettant de générer le DDL approprié pour la création de colonnes de table avec les contraintes de base de données souhaitées. Si vous pouvez ou voulez compter sur un fournisseur JPA tel que Hibernate, qui applique les contraintes de validation de bean à DDL par défaut, vous pouvez les omettre.

12
Sebastian Theek

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 procédera à la validation des entités à conserver.

Il générera une exception PropertyValueException indiquant que "la propriété non-null fait référence à une valeur null ou transitoire", si les attributs nullable = false n'ont pas de valeur, même si ces 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 .

8
Aleksandar Radulović