Quelle est la différence entre @Basic(optional = false)
et @Column(nullable = false)
dans la persistance JPA?
Quelle est la différence entre @Basic(optional = false)
et @Column(nullable = false)
dans la persistance JPA?
Réponses:
Gordon Yorke (membre du comité d'architecture d'EclipseLink, responsable technique de TopLink Core, membre du groupe d'experts JPA 2.0) a écrit une bonne réponse sur ce sujet, donc au lieu de le paraphraser, je vais citer sa réponse :
La différence entre
optional
etnullable
est la portée à laquelle ils sont évalués. La définition de «optional
» parle des valeurs de propriété et de champ et suggère que cette fonctionnalité doit être évaluée au cours de l'exécution. «nullable
» fait uniquement référence aux colonnes de la base de données.Si une implémentation choisit de l'implémenter,
optional
ces propriétés doivent être évaluées en mémoire par le fournisseur de persistance et une exception levée avant que SQL ne soit envoyé à la base de données, sinon lors de l'utilisation de violations 'updatable=false
' 'optional
', les violations ne seront jamais signalées.
@Basic(optional = false) @Column(nullable = false)
L'annotation @Basic marque la propriété comme non facultative au niveau de l'objet Java. Le deuxième paramètre, nullable = false sur le mappage de colonne, est uniquement responsable de la génération d'une contrainte de base de données NOT NULL. L'implémentation Hibernate JPA traite les deux options de la même manière dans tous les cas, vous pouvez donc aussi n'utiliser qu'une seule des annotations à cette fin.
The @Basic annotation marks the property as not optional on the Java object level.
Qu'est-ce que cela signifie? Donc, @Basic
c'est comme dire que créer la colonne de base de données NOT NULL
pour ladite variable?
J'ai donc essayé l'annotation @Basic (facultatif = false) en utilisant JPA 2.1 (EclipseLink) et il s'avère que l'annotation est ignorée dans l'utilisation réelle (au moins pour un champ String). (par exemple, les appels entityManager.persist).
Je suis donc allé à la spécification et j'ai lu à ce sujet. Voici ce que la spécification a à dire:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
De base (facultatif): indique si la valeur du champ ou de la propriété peut être nulle. Ceci est un indice et n'est pas pris en compte pour les types primitifs; il peut être utilisé dans la génération de schéma.
Je pense donc que cette phrase explique le cas d'utilisation réel de Basic (facultatif), il est utilisé dans la génération de schéma. (C'est-à-dire: lorsque vous générez CREATE TABLE SQL à partir de classes d'entité Java. C'est quelque chose qu'Hibernate peut faire par exemple.)
optional = false
sert uniquement à vérifier cette contrainte lors de l'exécution. nullable = false
crée une contrainte de base de données. Pour les applications, définir également a du optional = false
sens, car il est évalué plus rapidement que d'aller à la base de données et de vérifier cette contrainte là-bas ..