java - JPA:两个实体之间存在多个多对多关系?

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

我有两个实体类“用户”和“文档”。每个用户都有一个收件箱和一个发件箱,实际上是两个List,每个Document可能驻留在多个用户的收件箱和发件箱中。这是我的类(class):

@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

如何为这种多对多关系分配默认值?制作两个关联表会更好吗 -> 一个用于收件箱关系,另一个用于发件箱关系?我将如何做到这一点?这个问题的其他解决方案?

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

最佳答案

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

因此,您应该为 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>();

}

让另一个实体保持原样。希望这会有所帮助。

关于java - JPA:两个实体之间存在多个多对多关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043558/

相关文章:

java - NULL 对象的 StringBuffer 行为

java - 为什么我更新到 5.0 版本后收到 "No Persistence provider for EntityManager"?

mysql - Laravel 5.3 查询 - 具有投票总和的不同结果

java - 如何通过没有列表的电子邮件地址获取邮件主机名、协议(protocol)、端口和加密方法?

Java SQL Select 语句在 WHERE 子句中使用多个变量

java - 如何获取 JavaFX 标签的宽度和高度?

java - 在 JPA 中可以将已删除的实体保留在 @OneToMany 端的集合中吗?

java - Spring ORM JNDI Tomcat - 没有可用的实际事务的 EntityManager

many-to-many - 多选编辑表单选定值

php - Phalcon hasManyToMany 停止添加与数据库的关系