Pourquoi devrais-je spécifier @Column(nullable = false)?

j'ai une entité annoté avec @Entity.

Si je suis responsable de la création du CREATE TABLE scripts pourquoi devrais-je préciser @Column( nullable = false ) quand je peux créer une colonne dans la base de données avec le NOT NULL mots-clés? Est-il un exemple qui montre les avantages de l'utilisation de cette propriété dans un champ?

36
demandé sur Manuel Drieschmanns 2013-03-03 05:56:44

3 réponses

meilleurs messages d'erreur et gestion des erreurs, surtout si vous ajoutez aussi le JSR303 @NotNull annotation.

Si vous créez la colonne NOT NULL mais ne dites pas à JPA que ce n'est pas null, JPA supposera que les valeurs null sont OK. Quand vous essayez de sauver un objet avec nulls, il va procéder à envoyer cela à la DB et vous obtiendrez une erreur de niveau de DB. Cela augmente log spam dans la base de données et il est beaucoup plus difficile de déterminer à partir de l'erreur quelle colonne(s) de quel(s) table (s) ont été le problème, et encore moins les relier à leurs noms JPA.

si vous les annotez comme non null, JPA lancera une exception avant de sauvegarder, en évitant le spam de journal de DB et en vous donnant habituellement une meilleure erreur. En particulier, si votre fournisseur JPA prend en charge JSR303 et traduit nullable=false en @NotNull intérieurement ou vous avez ajouté @NotNull aussi, il vous donnera une structure de données que vous pouvez examiner pour voir exactement quels champs de quels objets ont été rejetés pour quelles raisons, avec personnalisable les messages d'erreur tempérés.

C'est pourquoi vous devez dire JPA sur NOT NULL champs. Cela, et il est plus facile pour les autres qui travaillent sur votre code de comprendre sans avoir à lire le schéma de la base de données.

49
répondu Craig Ringer 2017-08-20 05:54:52

de plus, si votre colonne a nullable = false@ManyToOne annotation, Hibernate does INTERIOR JOIN requête à la table correspondante. nullable = true donne en résultat GAUCHE REJOINDRE.

autre différence.

21
répondu Adam Tychoniewicz 2017-07-19 09:43:55

Dans votre cas, il pourrait ne pas être réel de la prestation, mais:

  • si vous utilisez votre fournisseur jpa pour générer votre schéma (via maven ou via la génération automatique comme hbm2ddl.auto), puis c'est important
  • si vous configurez votre fournisseur jpa pour valider le schéma par rapport au modèle d'entité, alors vous avez besoin qu'ils soient synchronisés.
3
répondu Bozho 2013-03-03 02:03:59