2010-11-30 6 views
0

Je suis un peu coincé la définition d'une entité Hibernate:Mise en veille prolongée: relations multiples FK

En supposant que j'ai les deux tableaux ci-dessous dans une base de données:

(A)

  • FromCompany
  • àCompagnie
  • viaCompany

(B)

  • CompanyID (PK)
  • Description

où les éléments de (A) pointe vers la clé primaire de (B); Il y a donc 3 relations un-à-un entre les FK et le PK. Je suppose que 3 instructions OneToOne avec différentes conditions mappedBy ne sont pas le chemin à parcourir, mh? A été une longue journée - je ne l'obtiens probablement pas;)

Merci pour votre aide!

+1

Est-ce vraiment OneToOne et non ManyToOne?Si le tableau A indique une table d'expédition, une entreprise du tableau B peut-elle expédier un seul article? – Qwerky

Répondre

0

Si je comprends bien, vous voulez que votre base de données pour ressembler à ceci:

tableA 
- id 
- fromCompanyId (references tableB.id) 
- toCompanyId (references tableB.id) 
- viaCompanyId (references tableB.id) 

tableB 
- id 
- description 

Si oui, vous pouvez certainement cela. Vous avez juste besoin de remplacer le nom de colonne par défaut pour la relation, afin que chaque association ait son propre nom de colonne au lieu de revenir au nom par défaut, ce qui rendrait les trois associations avec le même nom, causant des problèmes.

Je ne suis pas vraiment d'accord avec OneToOne, mais je suppose que c'était une décision consciente.

Voir ceci: http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-mapping-association

+0

Merci beaucoup les gars - maintenant quelques heures de sommeil plus tard, j'ai retrouvé mes capacités à penser;) et je me sens un peu désolé de t'embêter. – henning

+0

La structure de la table est en effet comme vous le pensiez. Oui, l'idée d'une relation One-To-One provient du scénario d'application. Bien qu'il y ait une chance, que le même ID est utilisé par exemple. de la société et via la société, j'ai tendance à les voir comme deux objets sémantiquement différents, parce que la société elle-même agit dans un rôle différent dans chaque champ de données ... difficile à décrire sans expliquer le tout. Mais vous avez certainement raison, en général, une relation un-à-plusieurs pourrait être le meilleur moyen. – henning

0

Vous pouvez certainement le faire avec des relations one-to-one. Vous auriez trois objets Company dans votre classe A et des mappings appropriés.

Cela aiderait si nous pouvions voir le code et les mappages d'hibernation.

0

La meilleure façon de mettre en œuvre la classe A avec 3 relations ManyToOne pointant vers ClassB

@Entity 
class ClassA { 

    //@ID 
    //private id; 

    @ManyToOne 
    private ClassB from; 

    @ManyToOne 
    private ClassB toCompany; 

    @ManyToOne 
    private ClassB viaCompany; 
} 

ne fonctionnerait pas, parce que chaque entité a besoin d'un Id. - Vous pouvez essayer de surmonter ce problème en utilisant un identifiant combinded (composé des trois associations), mais je suppose qu'il en résulte beaucoup de problèmes pour implémenter un ID composé d'associations à d'autres entités.

@see Hibernate/persistence without @Id

L'autre façon fournie par Hibernate sont appelés Associations ternaires. - Dans ce cas, vous modélisez la table complète A sous la forme d'une relation ternaire m: n. - Mais c'est une tâche très compliquée aussi.

@see http://docs.jboss.org/hibernate/core/3.5/reference/en/html/collections.html#collections-ternary

Questions connexes