2009-09-04 6 views
27

J'ai un à-plusieurs Modélisée à l'aide se joindre à la table:un à plusieurs avec une table de jointure

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

Les tableaux sont censés modéliser la relation d'un t1 t2 à beaucoup. Quelle est la bonne façon de modéliser ces tables en utilisant JPA?

+1

Je pense que vous pouvez trouver ce que vous cherchez à https://en.wikibooks.org/wiki/Java_Persistence/OneToMany#Example_of_a_OneToMany_using_a_JoinTable_database – Legna

Répondre

46

La table typique pour un T1 à plusieurs T2 est d'avoir une clé étrangère sur T2 pointant vers T1. La table T1_T2 n'est généralement pas nécessaire.

La structure JPA serait alors un un-à-plusieurs, éventuellement à deux voies.


Il pourrait y avoir des arrangements pour que la structure que vous décrivez fonctionne. Vous pouvez changer T1_T2:

  • ajouter une contrainte unique sur T2 (de sorte que seul T2 est autorisé)

Est-ce vraiment ce que vous voulez?

Edité: oui, il est ce que vous voulez ;-)

Je doute que vous pouvez trouver de nombreux exemples sur le net. Je n'ai aucune solution prouvée, mais je voudrais essayer quelque chose le long de ces lignes:

Dans Hibernate annotation reference documentation, voir "2.2.5.3.2.3 Unidirectionnel avec la table de jointure" pour avoir l'idée. Il ressemble à:

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

Merci pour votre réponse. C'est vrai que le mien n'est pas la structure la plus typique, mais j'ai d'autres raisons qui la rendent plus appropriée. La contrainte unique sur T2 est possible, mais je n'arrive toujours pas à la modéliser en utilisant les annotations JPA. Pourriez-vous s'il vous plaît expliquer plus loin? –

+0

OK. Je suis curieux de savoir ce qui pourrait rendre ce design "plus approprié" cependant. Pourriez-vous donner quelques conseils pour améliorer mes connaissances au cas où j'en aurais besoin à l'avenir? – KLE

+5

Merci. C'est vraiment instructif. En ce qui concerne la conception, lorsque le nombre d'enregistrements en T2 qui sont réellement liés à T1 est relativement faible, vous pouvez opter pour une table de jointure séparée plutôt que d'avoir un 't1_id' dans T2 qui est principalement 'NULL'. –