Per impostazione predefinita, @OneToMany
creerà una tabella di join solo se si utilizzerà la relazione unidirezionale .
In altre parole, se avete Employee
e Project
entità e l'entità Employee
è definito come segue (assumono non ci sono orm.xml
voci per queste entità):
@Entity
public class Employee {
// ...
@OneToMany
Set<Project> projects;
}
@Entity
public class Project {
// ...
}
il provider JPA creerà una tabella di join (avviso non esiste l'attributo mappedBy
nell'annotazione @OneToMany
in quanto non vi è alcun riferimento all'entità Employee
da Project
).
D'altra parte, se userete relazione bidirezionale:
@Entity
public class Employee {
// ...
@OneToMany(mappedBy="employee")
Set<Project> projects;
}
@Entity
public class Project {
// ...
@ManyToOne
Employee employee;
}
non verrà utilizzata la tabella unirsi, in quanto vi "molti" saranno utilizzati per memorizzare la chiave esterna per questa relazione.
Tuttavia, è possibile forzare l'utilizzo della tabella di unione anche nei casi in cui si ha una relazione bidirezionale @OneToMany
con l'attributo mappedBy
definito. Puoi ottenerlo usando l'annotazione @JoinTable
sul lato proprietario della relazione.
Esiste anche la possibilità, come già menzionato, di utilizzare @JoinColumn
nel caso in cui la tabella di join venga utilizzata per impostazione predefinita (rapporto unidirezionale @OneToMany
).
È meglio testare l'FK e unire la differenza di prestazioni del tavolo per te. Posso solo immaginare che meno join (in questo caso: FK) sembrano avere prestazioni migliori.
Inoltre, a volte il DBA definisce lo schema del database e devi solo adattare i tuoi mapping allo schema esistente. Quindi non hai scelta su FK o join table - è per questo che hai una scelta.
fonte
2011-12-20 16:05:34
Non è necessario utilizzare la tabella delle relazioni nella relazione 1: n. Chiedi più precisamente. –
Come impostazione predefinita, il mapping @OneToMany crea una tabella di join. Non so perché l'impostazione predefinita non è la mappatura con chiave esterna ... –
La mia ipotesi è che non è per prestazioni o svantaggi, ma perché JPA generalmente presuppone che tutti i campi all'interno di una tabella siano mappati all'interno dell'entità corrispondente. Questo è un caso limite dal momento che è più comune avere un OneToMany con un back ManyToOne. Con OneToMany unidirezionale che utilizza joincolumn, richiede che la tabella figlio abbia una chiave esterna, ma l'entità figlio non ha un riferimento al suo genitore. – Chris