web-dev-qa-db-fra.com

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

J'ai une entité annotée avec @Entity.
Si je suis responsable de la création des scripts CREATE TABLE Pourquoi devrais-je spécifier @Column( nullable = false ) quand je peux créer une colonne dans la base de données avec les mots clés NOT NULL? Y a-t-il un exemple qui montre les avantages de l'utilisation de cette propriété dans un champ?

40
Fagner Brack

Amélioration des messages d'erreur et de la gestion des erreurs, surtout si vous ajoutez également JSR303 @NotNull annotation .

Si vous créez la colonne en tant que NOT NULL mais ne dites pas à JPA qu'il n'est pas nul, JPA supposera que les valeurs nulles sont OK. Lorsque vous essayez d'enregistrer un objet avec des valeurs nulles, il procédera à l'envoi à la base de données et vous obtiendrez une erreur de niveau de base de données. Cela augmente le spam de journaux dans la base de données et il est beaucoup plus difficile de déterminer à partir de l'erreur quelle (s) colonne (s) de quelle (s) table (s) sont à l'origine du problème, et encore moins de les mapper à leurs noms JPA.

Si vous les annotez comme non nulles, JPA lèvera une exception avant l'enregistrement, évitant le spam de journal de base de données et vous donnant généralement une meilleure erreur. En particulier, si votre fournisseur JPA prend en charge JSR303 et traduit soit nullable=false en @NotNull en interne 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, ainsi que des messages d'erreur personnalisables.

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

52
Craig Ringer

De plus, si votre colonne contient nullable = false dans @ManyToOne annotation, Hibernate fait INNER JOIN requête vers la table associée. nullable = true donne le résultat LEFT JOIN.

C'est une autre différence.

28
Adam Tychoniewicz

Dans votre cas, il pourrait ne pas y avoir d'avantage réel, mais:

  • si vous utilisez votre fournisseur jpa pour générer votre schéma (soit via maven soit via une génération automatique comme hbm2ddl.auto), alors cela compte
  • si vous configurez votre fournisseur jpa pour valider le schéma par rapport au modèle d'entité, vous devez les synchroniser.
4
Bozho