@Basic (optionnel = false) vs @Column (nullable = false) dans JPA

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, responsable technique du kernel TopLink, membre du groupe d’experts JPA 2.0) a bien répondu à cette question. Au lieu de le paraphraser, je citerai sa réponse :

La différence entre optional et nullable est la scope à 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é soit évaluée dans le runtime. ‘ nullable ‘ est uniquement en référence aux colonnes de la firebase database.

Si une implémentation choisit d’implémenter optional ces propriétés doivent être évaluées en mémoire par le Persistence Provider et une exception déclenchée avant l’envoi de SQL à la firebase database lors de l’utilisation de ” updatable=false

J’ai donc essayé l’annotation @Basic (optional = false) à l’aide de 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 Ssortingng). (ex: appels entityManager.persist).

Je suis donc allé à la spécification et à lire à ce sujet. Voici ce que les spécifications ont à dire:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

Basique (facultatif): si la valeur du champ ou de la propriété peut être nulle. Ceci est un indice et est ignoré pour les types primitifs; il peut être utilisé dans la génération de schéma.

Donc, je pense que cette phrase explique le cas réel pour Basic (optionnel), il est utilisé dans la génération de schéma. (C’est-à-dire que lorsque vous générez CREATE TABLE SQL à partir de classes d’entité Java, Hibernate peut le faire, par exemple.)