Prima di tutto, alcuni chiarimenti alla risposta di KLE :
L'associazione uno-a-uno non vincolata (nullable) è l'unica che non può essere proxy senza la strumentazione bytecode. Il motivo di ciò è che l'entità proprietario DEVE sapere se la proprietà dell'associazione deve contenere un oggetto proxy o NULL e non può determinarlo osservando le colonne della sua tabella di base a causa del fatto che uno a uno è normalmente mappato tramite PK condiviso, quindi deve essere recuperato con impazienza in ogni caso rendendo inutile il proxy. Ecco una spiegazione più dettagliata .
molte associazioni (e una a molte, ovviamente) non soffrono di questo problema. L'entità proprietario può facilmente controllare il proprio FK (e nel caso di uno-a-molti, il proxy di raccolta vuoto viene creato inizialmente e popolato su richiesta), quindi l'associazione può essere pigra.
Sostituire uno a uno con uno a molti non è quasi mai una buona idea. Puoi sostituirlo con un unico molti-a-uno ma ci sono altre (forse migliori) opzioni.
Rob H. ha un punto valido, tuttavia potresti non essere in grado di implementarlo a seconda del tuo modello (ad es. Se la tua associazione one-to-one è nullable).
Ora, per quanto riguarda la domanda originale:
A) @ManyToOne(fetch=FetchType.LAZY)
dovrebbe funzionare bene. Sei sicuro che non venga sovrascritto nella query stessa? È possibile specificare join fetch
in HQL e / o impostare esplicitamente la modalità di recupero tramite l'API Criteria che avrebbe la precedenza sull'annotazione di classe. Se non è così e continui ad avere problemi, pubblica le tue classi, le tue query e il risultante SQL per conversazioni più mirate.
B) @OneToOne
è più complicato. Se non è assolutamente nullable, segui il suggerimento di Rob H. e specificalo come tale:
@OneToOne(optional = false, fetch = FetchType.LAZY)
Altrimenti, se è possibile modificare il database (aggiungere una colonna di chiave esterna alla tabella del proprietario), farlo e mapparlo come "unito":
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="other_entity_fk")
public OtherEntity getOther()
e in OtherEntity:
@OneToOne(mappedBy = "other")
public OwnerEntity getOwner()
Se non riesci a farlo (e non riesci a convivere con un impaziente recupero) la strumentazione bytecode è la tua unica opzione. Devo essere d'accordo con CPerkins , comunque - se ne hai 80 !!! si unisce a causa delle entusiaste associazioni OneToOne, hai problemi più grandi di questo :-)
one-to-one
con una formula simileselect other_entity.id from other_entity where id = other_entity.id
. Naturalmente, questo non è l'ideale per le prestazioni delle query.