2009-09-04 7 views
27

Ho una relazione uno-a-molti modellati utilizzando unirsi a tavola:One-a-molti con Join Tabella

create table t1 (id int primary key, name varchar(10) /*...*/); 
create table t2 (id int primary key, name varchar(10) /*...*/); 
create table t1_t2 (t1_id int, t2_id int, primary key (t1, t2)); 

Le tabelle dovrebbero modellare il rapporto di uno a molti t1 t2. Qual è il modo giusto per modellare queste tabelle usando JPA?

+1

Penso che si può trovare ciò che cercate a https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_using_a_JoinTable_database – Legna

risposta

46

La tabella tipica per un T1 su molti T2 deve avere una chiave esterna su T2 rivolta a T1. La tabella T1_T2 di solito non è necessaria.

La struttura JPA sarebbe quindi uno a molti, forse a due vie.


Potrebbero esserci alcune disposizioni per rendere funzionante la struttura che descrivi. Si potrebbe cambiare T1_T2:

  • aggiungere un vincolo univoco in T2 (in modo che solo una T2 è consentito)

'davvero questo che vuoi?

Redatta: sì, è quello che si vuole ;-)

Dubito che si possono trovare molti esempi in rete. Non ho alcuna soluzione provata, ma vorrei provare qualcosa in questo modo:

In Hibernate annotation reference documentation, vedere "2.2.5.3.2.3. Unidirezionale con join tabella" per ottenere l'idea. Sembra che:

@Entity 
    public class Trainer { 
     @OneToMany 
     @JoinTable(
      name="TrainedMonkeys", 
      joinColumns = @JoinColumn(name="trainer_id"), 
      inverseJoinColumns = @JoinColumn(name="monkey_id") 
     ) 
     public Set<Monkey> getTrainedMonkeys() { 
     ... 
    } 
+2

Grazie per la risposta. È vero che il mio non è la struttura più tipica, ma ho altre ragioni che lo rendono più adatto. Il vincolo univoco su T2 è possibile, ma non riesco ancora a capire come modellarlo usando le annotazioni JPA. Potresti spiegare ulteriormente? –

+0

OK. Sono curioso di sapere cosa potrebbe rendere questo disegno "più adatto". Potresti dare qualche suggerimento, per migliorare le mie conoscenze nel caso in cui avessi bisogno di questo in futuro? – KLE

+5

Grazie. Questo è davvero informativo. Per quanto riguarda il design, quando il numero di record in T2 che sono effettivamente correlati a T1 è relativamente piccolo, si può optare per avere una tabella di join separata piuttosto che avere un 't1_id' in T2 che è in gran parte' NULL'. –

Problemi correlati