2010-05-06 11 views
15

Come si crea una mappatura uno a uno facoltativa nel file hbm di ibernazione? Ad esempio, supponiamo di avere una tabella Utente e una last_visited_page. L'utente può o non può avere una pagina last_visited. Qui è il mio attuale mappatura uno-a-uno nel file HBM:Mappatura one-to-one facoltativa in Hibernate

User Class:

<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update"> 

LastVisitedPage Classe:

<one-to-one name="user" class="user" constrained="true" /> 

L'esempio di cui sopra non consente la creazione di un utente chi non ha un'ultima pagina visitata. Un utente appena creato non ha ancora visitato nessuna pagina. Come posso modificare la mappatura hbm per rendere opzionale la mappatura userPrefs?

risposta

12

Per quanto ne so, Hibernate non supporta opzionale one-to-one (vedere HHH-2007) quindi sarà necessario utilizzare un many-to-one falso con not-null="false" invece.

0

Se un utente ha al massimo una pagina last_visited, poi ci sono due casi:

(a) un dato utente non ha la pagina last_visited, nel qual caso non ci sarà alcuna tupla per questo utente nel last_visited_page table, (b) un determinato utente ha esattamente una pagina last_visited, nel qual caso ci sarà esattamente una tupla per questo utente nella tabella last_visited_page.

Ciò dovrebbe rendere evidente che userid è una chiave candidata nella tabella della pagina last-visited.

E ciò dovrebbe rendere evidente che è necessario dichiarare tale chiave per il DBMS.

4

Stavo riscontrando un problema simile, ma utilizzando le annotazioni. Google mi ha portato qui, quindi se qualcun altro si trovi nelle stesse sitatuions, questo ha funzionato per me:

http://opensource.atlassian.com/projects/hibernate/browse/ANN-725

Se stai usando le annotazioni, è possibile utilizzare l'@NotFound (action = NotFoundAction.IGNORE) annotazione in modo da non ottenere un'eccezione. Assicurati che il tuo codice controlli nulli perché ora potrebbe non esserci ;-)

9

Oggi trascorri la maggior parte della giornata cercando di fare una cosa simile, alla fine ho trovato la seguente soluzione (solo nel caso questo potrebbe essere utile per le altre persone)

@OneToOne 
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true) 

speranza che possa contribuire a salvare qualcuno qualche tempo

+2

Solo una cronaca - questa soluzione ha problemi se si utilizza Envers (che otterrete questo errore: https: //hibernate.onjira. com/browse/HHH-3853). Hibernate 3.6.8 ha risolto il problema con un mapping opzionale @OneToOne. – Phyxx

Problemi correlati