2012-04-06 46 views
5

Tôi có hai lớp thực thể 'Người dùng' và 'Tài liệu'. Mỗi người dùng có một hộp thư đến và hộp thư đi thực tế là hai Danh sách và mỗi Tài liệu có thể nằm trong nhiều hộp thư đến và hộp thư của người dùng. Dưới đây là lớp học của tôi:JPA: Quan hệ nhiều-nhiều giữa hai thực thể?

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

} 

Khi tôi chạy programm và cố gắng gán một tài liệu đến hộp thư của người dùng (và ngược lại), tôi nhận được lỗi sau:

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

Hiệp hội tạo bảng trông như thế này:

DOCUMENT_USER 
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID 

Làm cách nào để gán giá trị mặc định cho mối quan hệ nhiều-nhiều? Nó sẽ được tốt hơn để làm cho hai bảng hiệp hội -> một cho quan hệ hộp thư đến, một cho mối quan hệ outbox? Làm thế nào tôi sẽ đạt được điều đó? Các giải pháp khác cho vấn đề này?

Bất kỳ trợ giúp nào được đánh giá cao - cảm ơn rất nhiều trước!

+0

thử đặt @ManyToMany (cascade = CascadeType.ALL) trên phương thức getter của nó chứ không phải trường của nó. –

+0

@tech_learner đặt chú thích trong các trường là ổn, đó không phải là vấn đề. –

Trả lời

12

Tôi nghĩ rằng tùy chọn tốt hơn là có hai bảng riêng biệt, một bảng cho mỗi mối quan hệ. Bởi vì bạn thực sự có hai quan hệ giữa hai thực thể khác nhau, và không phải là một mối quan hệ với bốn thực thể khác nhau.

Vì vậy, bạn nên thêm chú thích @JoinTable vào từng thuộc tính của mình ở bên Document do bên User những mối quan hệ đó được ánh xạ tới thuộc tính. Một cái gì đó như sau:

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

} 

Rời khỏi thực thể khác như hiện tại. Hi vọng điêu nay co ich.

+0

Tuyệt vời! Rất cám ơn vì câu trả lời nhanh và hữu ích - bây giờ nó hoạt động như một nét duyên dáng :-) – salocinx

Các vấn đề liên quan