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

前端之家收集整理的这篇文章主要介绍了java – JPA:两个实体之间的多对多关系?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有两个实体类’User’和’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,?)")

生成的关联表如下所示:

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相关文章