2010-05-24 19 views

risposta

81

Gordon Yorke (EclipseLink Comitato Architettura Stati, TopLink Nucleo Technical Lead, JPA 2.0 Expert Group Stati) ha scritto una buona risposta su questo argomento così, invece di lui parafrasando, citerò his answer:

La differenza tra optional e nullable è l'ambito in cui vengono valutati gli . La definizione di 'optional' parla di proprietà e valori di campo e suggerisce che questa funzione debba essere valutata all'interno del runtime . 'nullable' è solo nel riferimento alle colonne del database.

Se l'applicazione sceglie di implementare optional poi quelle proprietà devono essere valutati in di memoria da parte del provider di persistenza e un'eccezione sollevata prima di SQL viene inviato al database altrimenti quando si utilizza 'updatable=false' 'optional' le violazioni non sarebbero mai state segnalate.

+6

Quindi, che dovrebbe essere usato davvero, forse entrambi? –

+32

@Xie Jilei: Dal libro: Java persistence con hibernate 2007, p. 179: '@Basic (facoltativo = falso) @Column (nullable = false)' L'annotazione @Basic contrassegna la proprietà come non facoltativa sul livello dell'oggetto Java . La seconda impostazione, nullable = false nella mappatura della colonna, è solo responsabile della generazione di un vincolo del database NOT NULL. L'implementazione di JPA di Hibernate tratta entrambe le opzioni nello stesso modo, quindi è possibile utilizzare come solo una delle annotazioni per questo scopo. – rapt

+2

@rapt - Non capisco 'L'annotazione @Basic contrassegna la proprietà come non facoltativa a livello di oggetto Java. Che cosa significa? Quindi, solo '@ Basic' è come dire che rendere la colonna del database' NOT NULL' per detta variabile? –

1

così ho provato il (= false opzionale) annotazione @Basic utilizzando JPA 2.1 (EclipseLink) e si scopre l'annotazione viene ignorato in effettivo utilizzo (almeno per un campo di stringa). (ad esempio chiamate entityManager.persist).

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

di base (opzionale): se il valore del campo o della proprietà può essere null. Questo è un suggerimento e non viene preso in considerazione per i tipi primitivi ; può essere usato nella generazione dello schema.

Quindi penso che questa frase spieghi il caso di utilizzo reale per Basic (facoltativo) utilizzato nella generazione dello schema. (Ovvero: quando generi CREATE TABLE SQL dalle classi di entità Java. Questo è qualcosa che Hibernate può fare per esempio.)

Problemi correlati