我的Spring JPA应用程序中有三个独立的实体 – User,Department,Role
我的数据库中有一个连接表来关联每个实体:USER_DEPARTMENT_ROLE
我的问题是,如何在我的实体类中定义这种关系?我是否必须在每个单独的实体中定义@ManyToMany关系?我知道如何定义两个表之间的这种关系,但是对于两个以上的表,我不知道从哪里开始.
任何帮助表示赞赏!
最佳答案
如果您在连接表中映射了两个以上的关系,那么我建议创建一个单独的实体,用于映射该特定表.
问题是你是否可以拥有一个独特的id列作为人工主键,或者你必须坚持使用三个外键的复合主键构建.
如果您可以添加该人工ID(这是设计数据库的现代方法),那么您的映射应如下所示:
选项1
class User {
@OnetoMany(mappedBy = "user",cascade = {CascadeType.PERSIST,CascadeType.MERGE})
private SetetoMany(mappedBy = "department",CascadeType.MERGE})
private SetetoMany(mappedBy = "role",CascadeType.MERGE})
private Set
关于为多对多关系设置级联类型是棘手的,对于涉及三个表的许多对很多甚至更棘手,因为每个实体可以根据情况发挥父或子的作用..我建议仅坚持使用级联= {CascadeType.PERSIST,CascadeType.MERGE}并手动处理其他操作.
如果必须使用复合主键,则应添加其他Id类并将链接实体更改为以下内容:
选项2
class User {
@OnetoMany(mappedBy = "linkPk.user",CascadeType.MERGE})
private SetetoMany(mappedBy = "linkPk.department",CascadeType.MERGE})
private SetetoMany(mappedBy = "linkPk.role",CascadeType.MERGE})
private Set
联动表
class UserDepartmentRoleLink {
@EmbeddedId
private UserDepartmentRoleLinkId linkPk
= new UserDepartmentRoleLinkId();
@Transient
public User getUser() {
return getLinkPk().getUser();
}
@Transient
public User getDepartment() {
return getLinkPk().getDepartment();
}
@Transient
public User getRole() {
return getLinkPk().getRole();
}
}
@Embeddable
public class UserDepartmentRoleLinkId implements java.io.Serializable {
@ManyToOne(cascade = {CascadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name = "role_id")
private Role role;
最重要的是,你可以在这里使用多对多,如本文所述 – > example.但是在我看来,如果你按照上面的方式绘制链接表,你会省去很多麻烦.最后这个电话是你的..
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。