2012-04-06 211 views
5

我有兩個實體類'用戶'和'文檔'。每個用戶都有一個收件箱和一個發件箱,實際上它們是兩個列表,每個文檔可以駐留在多個收件箱和發件箱的用戶中。這裏是我的課:JPA:兩個實體之間有多個多對多的關係?

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

} 

當我運行PROGRAMM並嘗試將文檔分配給用戶的收件箱(反之亦然),我收到以下錯誤:

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

生成的關聯表看起來像這樣:

DOCUMENT_USER 
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID 

我該如何爲這種多對多關係分配默認值?製作兩個關聯表是否會更好 - >一個用於收件箱關係,另一個用於發件箱關係?我將如何實現這一目標?解決這個問題的其他方法?

任何幫助高度讚賞 - 非常感謝提前!

+0

嘗試將@ManyToMany(cascade = CascadeType.ALL)放在其getter方法而不是其字段上。 – 2012-04-06 12:44:38

+0

@tech_learner在域中添加註釋是沒問題的,這不是問題。 – 2012-04-06 12:49:05

回答

12

我認爲更好的選擇是有兩個單獨的表,每個關係一個。因爲你實際上在兩個不同的實體之間有兩個關係,而不是一個與四個不同實體的關係。

因此,您應該爲Document一側的每個屬性添加@JoinTable註釋,因爲這些關係的User一側被映射到屬性。類似以下內容:

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

} 

將其他實體保留爲現在的狀態。希望這可以幫助。

+0

太棒了!非常感謝您的快速和有用的答案 - 現在它就像一個魅力:-) – salocinx 2012-04-06 13:02:40

相關問題