2009-09-04 16 views
27

que tiene una relación uno-a-muchos modelan mediante tabla de unión:Uno-A-Muchos Relación con la tabla de unión

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)); 

Se supone que las tablas para modelar la relación de uno a muchos t1 t2. ¿Cuál es la forma correcta de modelar estas tablas usando JPA?

+1

creo que se puede encontrar lo que busca en https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_using_a_JoinTable_database – Legna

Respuesta

46

La tabla típica para un T1 a muchos T2 es tener una clave externa en T2 apuntando hacia T1. La tabla T1_T2 generalmente no es necesaria.

La estructura JPA sería entonces de uno a muchos, posiblemente de dos vías.


Podría haber algunos arreglos para que la estructura que describe funcione. Se podría cambiar T1_T2:

  • añadir una restricción única en T2 (de modo que sólo se permite una T2)

¿Es eso realmente lo que quieres?

Editado: sí, es lo que quiere ;-)

Dudo que pueda encontrar muchos ejemplos en la red. No tengo una solución comprobada, pero probaría algo como esto:

En Hibernate annotation reference documentation, consulte "2.2.5.3.2.3. Unidireccional con la tabla de unión" para obtener la idea. Parece que:

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

Gracias por su respuesta. Es cierto que el mío no es la estructura más típica, pero tengo otras razones que lo hacen más adecuado. La restricción única en T2 es posible, pero todavía no entiendo cómo debería modelarlo usando anotaciones JPA. ¿Podrías explicar más? –

+0

OK. Tengo curiosidad de lo que podría hacer este diseño "más adecuado" sin embargo. ¿Podría dar algunas pistas para mejorar mi conocimiento en caso de que necesite esto en el futuro? – KLE

+5

Gracias. Eso es realmente informativo. En cuanto al diseño, cuando el número de registros en T2 que están realmente relacionados con T1 es relativamente pequeño, puedes optar por tener una tabla de combinación separada en lugar de tener un 't1_id' en T2 que es principalmente' NULL'. –

Cuestiones relacionadas