Quelle est la différence entre @Basic(optional = false)
et @Column(nullable = false)
dans la persistance JPA?
Gordon Yorke (membre du comité d'architecture EclipseLink, chef technique principal de TopLink, membre du groupe d'experts JPA 2.0) a écrit une bonne réponse sur ce sujet.Au lieu de le paraphraser, je citerai 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 propriétés et des valeurs 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 d'implémenter
optional
, ces propriétés doivent être évaluées en mémoire par le fournisseur de persistance et une exception déclenchée avant que SQL ne soit envoyé à la base de données sinon lors de l'utilisation de 'updatable=false
''optional
'les violations ne seraient jamais signalées.
J'ai donc essayé l'annotation @Basic (facultatif = faux) à l'aide de JPA 2.1 (EclipseLink) et il s'avère que l'annotation est ignorée en utilisation réelle (au moins pour un champ String). (par exemple, les appels entityManager.persist).
Je suis donc allé à la spécification et je l'ai lu. 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émas.
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émas. (C'est-à-dire: lorsque vous générez CREATE TABLE SQL à partir de Java Classes d'entité. C'est quelque chose qu'Hibernate peut faire par exemple.)