@Basic (opzionale = false) vs @Column (nullable = false) in JPA

Qual è la differenza tra @Basic(optional = false) e @Column(nullable = false) nella persistenza JPA?

Gordon Yorke (membro del comitato di architettura di EclipseLink, responsabile tecnico di TopLink Core, membro del gruppo di esperti JPA 2.0) ha scritto una buona risposta su questo argomento così, invece di parafrasarlo, citerò la sua risposta :

La differenza tra optional e nullable è lo scopo con cui vengono valutati. La definizione di ” optional ” parla della proprietà e dei valori dei campi e suggerisce che questa funzione debba essere valutata all’interno del runtime. ‘ nullable ‘ è solo in riferimento alle colonne del database.

Se un’implementazione sceglie di implementare optional tali proprietà devono essere valutate in memoria dal Persistence Provider e un’eccezione sollevata prima che SQL venga inviato al database, altrimenti quando si utilizzano le violazioni ‘ optional updatable=false ‘ ‘ optional ‘ non verrebbero mai segnalate.

Così ho provato l’annotazione @Basic (opzionale = falso) usando JPA 2.1 (EclipseLink) e si scopre che l’annotazione è ignorata nell’utilizzo effettivo (almeno per un campo String). (es. chiamate entityManager.persist).

Quindi sono andato alle specifiche e ho letto su di esso. Ecco cosa ha da dire la specifica:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

Base (facoltativo): se il valore del campo o della proprietà può essere nullo. Questo è un suggerimento ed è ignorato per i tipi primitivi; può essere usato nella generazione dello schema.

Quindi penso che questa frase spieghi il caso d’uso reale per Basic (opzionale) che è usato nella generazione dello schema. (Ovvero: quando generate CREATE TABLE SQL dalle classi Java Entity. Questo è qualcosa che Hibernate può fare per esempio.)