2012-08-10 16 views
18

Ho due entità di database: Forum e Topic.JPA: annotazione chiave esterna

Topic ha il membro di dati protected long forumId, che indica ovviamente il forum di Topic.

La mia domanda è quale annotazione utilizzare per questo membro dati?

+0

Non è necessario dichiarare 'forumId' in' Argomento'. –

+0

perché dici così? Penso che sia necessario perché devo sapere quale forum l'argomento appartiene a – socksocket

+1

@socksocket Penso che sia perché è possibile annotare un attributo 'Forum', specificando l'id con l'annotazione' @ JoinColumn', vedere la mia risposta. ;) – elias

risposta

25

Come Forum ha molti argomenti, e un argomento appartiene ad uno e solo Forum, probabilmente si vuole andare con un attributo di tipo Forum annotato con @ManyToOne:

@ManyToOne 
@JoinColumn(name = "forumId") 
private Forum forum; 

guarda anche:

ManyToOne e JPA mapping

+5

ma il "problema" in questo caso è che quando serializzi l'Argomento su XML o JSON (per passarlo ad un client, ad esempio), l'intero oggetto Forum verrà serializzato di default ... stessa cosa se si carica un argomento sul server, è necessario passare l'intero argomento Argomento + Forum, non è possibile utilizzare solo l'id del forum. In alcuni casi, sembra più semplice inserire manualmente la chiave esterna dell'entità correlata. – splinter123

1

@ManyToOne Come l'annotazione implica - si hanno molti argomenti per forum

5

Come altri hanno risposto -
È necessario utilizzare le annotazioni ManyToOne e JoinColumn.
Bare in mente, dal momento che JPA riguarda ORM - Mappatura relazionale dell'oggetto,
Si dovrebbe fare riferimento a un altro oggetto come avresti fatto "naturalmente" in Java - cioè tramite un oggetto e non tramite il suo identificatore (che è forumId) in il tuo caso),
Questa era una delle considerazioni progettuali tra le relazioni a JPA e Hibernate (in precedenza a JPA).