JPA:两个实体之间的多对多关系?

时间:2012-04-06 12:35:34

标签: java jpa many-to-many default-value

我有两个实体类'User'和'Document'。每个用户都有一个收件箱和一个发件箱,实际上是两个List,每个Document可以驻留在多个收件箱和发件箱的用户中。这是我的课程:

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

}

当我运行该程序并尝试将文档分配给用户的收件箱时(反之亦然),我收到以下错误:

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

如何为这种多对多关系指定默认值?制作两个关联表会更好吗?&gt;一个用于收件箱关系,另一个用于收件箱关系?我怎么做到这一点?这个问题的其他解决方案?

非常感谢任何帮助 - 非常感谢提前!

1 个答案:

答案 0 :(得分:15)

我认为更好的选择是有两个单独的表,每个关系一个。因为你实际上在两个不同的实体之间有两个关系,而不是一个与四个不同实体的关系。

因此,您应该为@JoinTable方面的每个属性添加Document注释,因为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>();

}

保留现在的其他实体。希望这会有所帮助。