2012-04-06 17 views
5

Ho due classi di entità 'Utente' e 'Documento'. Ogni utente ha una casella di posta in arrivo e una casella di posta in uscita che sono in realtà due elenchi e ciascun documento può risiedere in più caselle di posta in arrivo e in uscita di utenti. Qui ci sono le mie classi:JPA: più relazioni molti-a-molti tra due entità?

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

} 

Quando eseguo il programma e cercare di assegnare un documento alla casella di posta di un utente (e viceversa), ottengo il seguente errore:

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 (?, ?)") 

L'associazione generata tabella è simile a questa:

DOCUMENT_USER 
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID 

Come si assegnano i valori predefiniti per una tale relazione molti-a-molti? Sarebbe meglio creare due tabelle di associazione -> una per la relazione inbox, un'altra per la relazione outbox? Come potrei realizzarlo? Altre soluzioni a questo problema?

Qualsiasi aiuto molto apprezzato - molte grazie in anticipo!

+0

provare a mettere @ManyToMany (cascade = CascadeType.ALL) sul suo metodo getter non sul suo campo. –

+0

@tech_learner che inserisce annotazioni nei campi va bene, non è questo il problema. –

risposta

12

Penso che l'opzione migliore sia avere due tabelle separate, una per relazione. Perché in realtà hai due relazioni tra due entità diverse e non una relazione con quattro entità diverse.

Pertanto, è necessario aggiungere un'annotazione @JoinTable a ciascuno degli attributi nel lato Document poiché il lato User è associato a tali proprietà. Qualcosa come il seguente:

@Entity 
public class Document { 

    @Id 
    private Long id; 

    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "document_inbox", joinColumns = @JoinColumn(name = "userinbox_id"), 
       inverseJoinColumns = @JoinColumn(name = "inbox_id")) 
    private List<User> userinbox = new ArrayList<User>(); 
    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "document_outbox", joinColumns = @JoinColumn(name = "useroutbox_id"), 
       inverseJoinColumns = @JoinColumn(name = "outbox_id")) 
    private List<User> useroutbox = new ArrayList<User>(); 

} 

Lasciare l'altra entità come è ora. Spero che questo ti aiuti.

+0

Ottimo! Molte grazie per la risposta veloce e utile - ora funziona come un fascino :-) – salocinx

Problemi correlati