web-dev-qa-db-fra.com

@Basic (facultatif = faux) vs @Column (nullable = false) dans JPA

Quelle est la différence entre @Basic(optional = false) et @Column(nullable = false) dans la persistance JPA?

94
joaosavio

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 et nullable 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.

89
Pascal Thivent

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.)

3
Ray Hulha