2012-04-06 13 views
5

Ich habe zwei Entitätsklassen 'Benutzer' und 'Dokument'. Jeder Benutzer hat einen Posteingang und einen Postausgang, bei denen es sich tatsächlich um zwei Listen handelt, und jedes Dokument kann sich in mehreren Posteingängen und Postausgängen von Benutzern befinden. Hier sind meine Klassen:JPA: Mehrere Viele-zu-Viele-Beziehungen zwischen zwei Entitäten?

@Entity 
public class User { 

    @Id 
    private Long id; 

    @ManyToMany(mappedBy = "userinbox", cascade=CascadeType.ALL) 
    private List<Document> inbox = new ArrayList<Document>(); 
    @ManyToMany(mappedBy = "useroutbox", cascade=CascadeType.ALL) 
    private List<Document> outbox = new ArrayList<Document>(); 

} 

@Entity 
public class Document { 

    @Id 
    private Long id; 

    @ManyToMany(cascade=CascadeType.ALL) 
    private List<User> userinbox = new ArrayList<User>(); 
    @ManyToMany(cascade=CascadeType.ALL) 
    private List<User> useroutbox = new ArrayList<User>(); 

} 

Wenn ich das Programm laufen und versuchen, ein Dokument zu dem Posteingang eines Benutzers (und umgekehrt) zu vergeben, erhalte ich die folgende Fehlermeldung:

Error Code: 1364 

Call: INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?) 
    bind => [2 parameters bound] 

Internal Exception: java.sql.SQLException: Field 'useroutbox_ID' doesn't have a default value 

Query: DataModifyQuery(name="userinbox" sql="INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?)") 

Der erzeugte Verband Tabelle sieht so aus:

DOCUMENT_USER 
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID 

Wie würde ich Standardwerte für eine solche Viele-zu-Viele-Beziehung zuweisen? Wäre es besser, zwei Zuordnungstabellen zu erstellen -> eine für die Inbox-Relation, eine andere für die Outbox-Relation? Wie würde ich das erreichen? Andere Lösungen für dieses Problem?

Jede Hilfe sehr geschätzt - vielen Dank im Voraus!

+0

versuchen, die @ManyToMany (cascade = CascadeType.ALL) auf ihre Getter-Methode, nicht ihr Feld. –

+0

@tech_learner Putting Annotations in Feldern ist in Ordnung, das ist nicht das Problem. –

Antwort

12

Ich denke, dass die bessere Option ist, zwei separate Tabellen zu haben, eine pro Relation. Weil Sie tatsächlich zwei Relationen zwischen zwei verschiedenen Entitäten haben und nicht eine Relation mit vier verschiedenen Entitäten.

Daher sollten Sie eine @JoinTable Annotation zu jedem Ihrer Attribute in der Document Seite hinzufügen, da die User Seite diese Beziehungen einer Eigenschaft zugeordnet sind. So etwas wie das Folgende:

Lassen Sie die andere Entität wie sie jetzt ist. Hoffe das hilft.

+0

Großartig! Vielen Dank für die schnelle und nützliche Antwort - jetzt funktioniert es wie ein Zauber :-) – salocinx

Verwandte Themen