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


Risposte:


98

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 optionale nullableè 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, optionalquelle 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.


8
Quindi, quale dovrebbe essere davvero usato, forse entrambi?
Xiè Jìléi

39
@Xie Jilei: Dal libro: Java persistence with hibernate 2007, p. 179: @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.
rapito il

2
@rapt - Non capisco 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 NULLper detta variabile?
Erran Morad

9
Significa che se si tenta di rendere persistente un'entità con un campo null, verrà generata un'eccezione se è contrassegnata come optional = false (senza contattare il database) e l'entità non verrà aggiunta al contesto di persistenza JPA. Se è annotato solo per essere nullable = false, l'entità verrà aggiunta al contesto di persistenza e quando si tenta di scrivere l'entità nel database (ad esempio tramite flush) proverà a scrivere l'entità nel database che lo negherà e allora genererà un'eccezione.
Ray Hulha

@RayHulha ho provato ad annotare un campo con "@Basic (optional = false)", e ho aggiunto una tupla al database (con il valore di questo campo = null), non è stata sollevata alcuna eccezione !!, spero che tu possa spiegare a me questo comportamento.
ziMtyth

4

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


1
È divertente che l'altra risposta implichi che è nullable e non Basic utilizzato per la generazione dello schema (quando dice «'nullable' è solo in riferimento alle colonne del database»). È ancora molto confuso. Immagino che nullable venga utilizzato per la generazione dello schema e Basic (opzionale = false) può essere utilizzato per lo stesso scopo? Ha senso?
marcus

optional = falseserve solo per controllare questo vincolo in runtime. nullable = falsecrea vincoli di database. Per le applicazioni, anche impostare optional = falseha senso, perché viene valutato più velocemente che andare al database e controllare quel vincolo lì ..
nimo23
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.