2010-12-10 7 views
2

J'ai une relation bidirectionnelle OneToMany/ManyToOne utilisant une table de jointure. Les enfants sont dans une liste et sont commandés.Suppression de la duplication dans une relation bidirectionnelle OneToMany/ManyToOne à l'aide d'un JoinTable (avec une OrderColumn)

est ici la configuration:

Parent:

@OneToMany(cascade=CascadeType.ALL) 
@JoinTable(
    name="parent_child", 
    [email protected](name="parent_id"), 
    [email protected](name="child_id") 
) 
@OrderColumn(name="child_order") 
public List<Child> getChildren() { 
    return children; 
} 

enfant:

@ManyToOne 
public Parent getParent() { 
    return parent; 
} 

Voici ma question: La table parent est comme prévu, mais voici les tables enfant et PARENT_CHILD:

enfant:

int8 id, 
int8 parent_id <--- 

PARENT_CHILD:

int8 parent_id, <--- 
int8 child_id, 
int8 child_order 

Il y a double emploi avec le parent_id - il est spécifié dans la table de jointure et dans la table des enfants qui signifie qu'il est possible d'appeler parent.getChildren() get (0) .getParent.() et finir avec un parent différent de celui que vous avez commencé, ce qui devrait être impossible (et j'aimerais que cela soit appliqué au niveau de la base de données). La seule façon de résoudre ce problème est d'utiliser une colonne de jointure dans l'enfant et de ne pas utiliser de table de jointure du tout. Mais je n'aime pas ça parce que je dois alors passer l'ordre à l'enfant, et les docteurs Hibernate disent qu'un JoinColumn avec OneToMany devrait être évité (mais ils ne disent pas vraiment pourquoi).

Existe-t-il un autre moyen de se débarrasser de cette duplication/incohérence possible? C'est à dire. une façon d'avoir l'enfant connaître son parent en utilisant les données de la table de jointure?

Répondre

1

Essayez ceci si cela fonctionne. Notez l'utilisation de JoinColumn

@OneToMany(cascade=CascadeType.ALL) 
    @OrderColumn(name="child_order") 
    public List<Child> getChildren() { 
     return children; 
    } 

enfant

@ManyToOne 
    @JoinColumn("parent_id") 
    public Parent getParent() { 
     return parent; 
    } 
0

Il y a double emploi avec le parent_id - il est spécifié dans la table de jointure et dans la table des enfants qui signifie qu'il est possible d'appeler parent.getChildren () .get (0) .getParent() et se retrouvent avec un parent différent de celui que vous avez commencé

Je ne comprends pas comment cela peut-il être possible, quand un enfant peut ve un seul parent. Il devrait y avoir une seule et unique base de données d'enregistrement pour un tuple parent-enfant donné et l'enfant n'existera jamais dans aucun autre tuple de parent-enfant. Bien sûr, le parent sera répété dans la table parent_child mais jamais un enfant ne sera répété. Avez-vous spécifié les contraintes de clé étrangère sur les tables de base de données? Utilisez l'élément mappedBy dans la méthode getParent().

Questions connexes