2011-11-25 9 views
14

Mi sono imbattuto in questo esempio in Specifica FR 2.0 JPA, 11.1.37. OnetoOne Annotazione, pagina 403:@OneToOne (facoltativo = falso) e @JoinColumn (nullable = falso) usati insieme

@OneToOne(optional=false) 
@JoinColumn(name="CUSTREC_ID", unique=true, nullable=false, updatable=false) 
public CustomerRecord getCustomerRecord() { return customerRecord; } 

v'è alcuna ragione che dovrei mettere @OneToOne(optional=false) e in quel tempo stesso messo @JoinColumn(... nullable=false)?

Queste due dichiarazioni non sono le stesse? Non è uno di loro ridondante?
Sono entrambi utilizzati nella generazione dello schema DDL?

risposta

26

Formalmente optional=false è un'istruzione di runtime all'implementazione JPA e nullable=false è un'istruzione per il generatore DDL. Quindi non sono strettamente ridondanti.

La differenza può diventare significativa quando è coinvolta l'ereditarietà dell'entità. Se una mappatura particolare esiste solo in una sottoclasse e si dispone di una strategia per gerarchia per tabella singola tabella, il mapping OneToOne può essere optional=false nella sottoclasse specifica che contiene la mappatura. Tuttavia, la colonna di join effettiva non può essere resa non nullo, poiché non è possibile inserire altre sottoclassi che condividono la tabella!

In pratica versioni diverse di provider diversi possono o non possono interpretare uno dei due in qualsiasi momento, caveat emptor.

+4

Molto obbligato per una risposta così chiara! –