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

  1. Lorsqu'ils apparaissent sur un champ/de lecture d'un @Entity, quelle est la différence entre eux? (Je persiste l'entité via Hibernate ).

  2. Quel cadre et / ou spécification chacun d'entre eux appartient?

  3. @NotNull est situé à l'intérieur de javax.validation.constraints. Dans le javax.validation.constraints.NotNull javadoc, il est dit

    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?

185
demandé sur Karl Richter 2011-09-16 06:20:11

3 réponses

@NotNull est un JSR 303 Bean Validation annotation. 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 JSR 303, cependant, il ramasse intelligemment ces contraintes et les traduit en contraintes de base de données pour vous, de sorte que vous obtenez deux pour le prix d'un. @Column(nullable = false) est la manière JPA de déclarer une colonne non nulle. C'est-à-dire que le premier est destiné à la validation et le second à l'indication du schéma de base de données détail. Vous obtenez juste un peu plus (et bienvenue!) aide de Hibernate sur les annotations de validation.

254
répondu Ryan Stewart 2015-06-03 06:30:23

Les versions les plus récentes du fournisseur JPA hibernate appliquent les contraintes de validation de bean (jsr 303) comme @NotNull à DDL par défaut (grâce à hibernate.validator.apply_to_ddl property par défaut à true). Mais il n'y a aucune garantie que d'autres fournisseurs de JPA le font ou même ont la capacité de le faire.

Vous devez utiliser des annotations de validation de bean comme @NotNull pour vous assurer que les propriétés de bean sont définies sur une valeur none-null, 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 les situations devraient 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 le bon DDL pour créer des colonnes de table avec les contraintes de base de données souhaitées. Si vous pouvez ou voulez compter sur un fournisseur JPA comme Hibernate, qui applique les contraintes de validation de bean à DDL par défaut, vous pouvez les omettre.

8
répondu Sebastian Theek 2017-06-11 03:58:26

Intéressant à noter, 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 hibernate.l'option check_nullability est définie sur true, Hibernate effectuera la validation des entités à persister.

Il lancera PropertyValueException en disant que "la propriété not-null fait référence à une valeur NULL ou transitoire", si nullable = false attributs n'ont pas de valeurs, même si de telles restrictions ne le sont pas implémenté dans la couche de base de données.

Plus d'informations sur hibernate.l'option check_nullability est disponible ici: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping.

4
répondu Aleksandar Radulović 2018-02-21 11:42:13