2010-01-08 3 views
0

J'ai une classe Hibernate appelée Expression (simplifiée ici pour votre plaisir visuel):Mise en veille prolongée crée deux clés primaires quand je veux une seule

@Entity 
public class Expression { 
    @Id 
    @GeneratedValue 
    private long id; 

    private String data; 

    @OneToMany(fetch=FetchType.EAGER) 
    @Cascade({CascadeType.MERGE, CascadeType.PERSIST}) 
    private Set<Expression> dependencies; 
} 

Cela crée deux tables, Expression(id, data) et Expression_Expression(expression_id, dependencies_id). Cependant, Hibernate définit les colonnes expression_id et dependencies_id comme clé primaire, donc je ne peux pas avoir de doublons dependencies_id, ce que je voudrais.

Par exemple, si j'ai trois expressions:

Expression x = new Expression("0"); 
Expression y = new Expression("1"); 
Expression z = new Expression("x + y"); 
Set<Expression> tmp = new HashSet<Expression>(); 
tmp.add(x); 
tmp.add(y); 
z.setDependencies(tmp); 
// Persist x, y, and z. 

Hibernate va effectuer les opérations suivantes:

Insérer x dans la table Expression avec id = 1 et data = "0"
Insérer y dans le tableau Expression avec id = 2 et data = "1"
Insérez z dans le tableau Expression avec id = 3 et data = "a + b »
insérer une ligne dans la table 'Expression_Expression' avec expression_id = 3 et dependencies_id = 1. (Making z à la charge d'x.)

Mais lorsqu'il tente d'insérer une ligne dans la table Expression_Expression avec expression_id = 3 et dependencies_id = 2 (rendant z dans une personne à charge de y) Je reçois une erreur d'entrée en double.

J'aimerais pouvoir avoir plusieurs lignes dans le tableau Expression_Expression avec la même valeur expression_id.

Toute aide serait grandement appréciée!

Répondre

2

Vous devez utiliser la relation @ManyToMany ici

Questions connexes