java表与表之间的关系_java – @ManyToMany三个表之间的关系

如果您在连接表中映射了两个以上的关系,那么我建议创建一个单独的实体,用于映射该特定表.

问题是你是否可以拥有一个独特的id列作为人工主键,或者你必须坚持使用三个外键的复合主键构建.

如果您可以添加该人工ID(这是设计数据库的现代方法),那么您的映射应如下所示:

选项1

class User {

@OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE})

private Set userDepartmentRoleLinks;

}

class Department{

@OneToMany(mappedBy = "department", cascade = {CascadeType.PERSIST, CascadeType.MERGE})

private Set userDepartmentRoleLinks;

}

class Role{

@OneToMany(mappedBy = "role", cascade = {CascadeType.PERSIST, CascadeType.MERGE})

private Set userDepartmentRoleLinks;

}

class UserDepartmentRoleLink {

@Id

@GeneratedValue

private Long id;

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

@JoinColumn(name = "user_id")

private User user;

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

@JoinColumn(name = "department_id")

private Department department;

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

@JoinColumn(name = "role_id")

private Role role;

}

关于为多对多关系设置级联类型是棘手的,对于涉及三个表的许多对很多甚至更棘手,因为每个实体可以根据情况发挥父或子的作用..我建议仅坚持使用级联= {CascadeType.PERSIST,CascadeType.MERGE}并手动处理其他操作.

如果必须使用复合主键,则应添加其他Id类并将链接实体更改为以下内容:

选项2

class User {

@OneToMany(mappedBy = "linkPk.user", cascade = {CascadeType.PERSIST, CascadeType.MERGE})

private Set userDepartmentRoleLinks;

}

class Department{

@OneToMany(mappedBy = "linkPk.department", cascade = {CascadeType.PERSIST, CascadeType.MERGE})

private Set userDepartmentRoleLinks;

}

class Role{

@OneToMany(mappedBy = "linkPk.role", cascade = {CascadeType.PERSIST, CascadeType.MERGE})

private Set userDepartmentRoleLinks;

}

联动表

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 = "user_id")

private User user;

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

@JoinColumn(name = "department_id")

private Department department;

@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

@JoinColumn(name = "role_id")

private Role role;

最重要的是,你可以在这里使用多对多,如本文所述 – > example.但是在我看来,如果你按照上面的方式绘制链接表,你会省去很多麻烦.最后这个电话是你的..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值