Qual è la differenza tra @Basic(optional = false)
e @Column(nullable = false)
nella persistenza JPA?
Qual è la differenza tra @Basic(optional = false)
e @Column(nullable = false)
nella persistenza JPA?
Risposte:
Gordon Yorke (membro del comitato di architettura EclipseLink, responsabile tecnico di TopLink Core, membro del gruppo di esperti JPA 2.0) ha scritto una buona risposta su questo argomento, quindi invece di parafrasarlo, citerò la sua risposta :
La differenza tra
optional
enullable
è l'ambito in cui vengono valutati. La definizione di "optional
" parla di proprietà e valori di campo e suggerisce che questa caratteristica dovrebbe essere valutata durante il runtime. 'nullable
' è solo in riferimento alle colonne del database.Se un'implementazione sceglie di implementare,
optional
quelle proprietà dovrebbero essere valutate in memoria dal Persistence Provider e un'eccezione sollevata prima che SQL venga inviato al database, altrimenti quando si utilizzano violazioni 'updatable=false
' 'optional
' non verrebbe mai segnalata.
@Basic(optional = false) @Column(nullable = false)
l'annotazione @Basic contrassegna la proprietà come non facoltativa a livello di oggetto Java. La seconda impostazione, nullable = false sulla mappatura della colonna, è responsabile solo della generazione di un vincolo di database NOT NULL. L'implementazione di Hibernate JPA tratta entrambe le opzioni allo stesso modo in ogni caso, quindi puoi anche utilizzare solo una delle annotazioni per questo scopo.
The @Basic annotation marks the property as not optional on the Java object level.
cosa significa? Quindi, @Basic
è solo come dire che crea la colonna del database NOT NULL
per detta variabile?
Quindi ho provato l'annotazione @Basic (opzionale = false) utilizzando JPA 2.1 (EclipseLink) e si scopre che l'annotazione viene ignorata nell'uso effettivo (almeno per un campo String). (es. chiamate entityManager.persist).
Così sono andato alle specifiche e ho letto qualcosa al riguardo. Ecco cosa ha da dire la specifica:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Di base (opzionale): indica se il valore del campo o della proprietà può essere nullo. Questo è un suggerimento e viene ignorato per i tipi primitivi; può essere utilizzato nella generazione di schemi.
Quindi penso che questa frase spieghi il vero caso d'uso per Basic (opzionale) che viene utilizzato nella generazione di schemi. (Cioè: quando generi CREATE TABLE SQL da classi Java Entity. Questo è qualcosa che Hibernate può fare, ad esempio.)
optional = false
serve solo per controllare questo vincolo in runtime. nullable = false
crea vincoli di database. Per le applicazioni, anche impostare optional = false
ha senso, perché viene valutato più velocemente che andare al database e controllare quel vincolo lì ..