我有三个独立的实体,我的春天JPA应用 - 用户,部门,角色@ManyToMany之间的关系三表
我有一个单独的连接表在我的数据库中涉及这些实体:USER_DEPARTMENT_ROLE
我的问题是,我如何在实体类中定义这个关系?我必须在每个独立的实体中定义一个@ManyToMany
关系吗?我知道如何定义两个表格之间的这种关系,但对于两个以上的表达式我不知道从哪里开始。
任何帮助表示赞赏!
我有三个独立的实体,我的春天JPA应用 - 用户,部门,角色@ManyToMany之间的关系三表
我有一个单独的连接表在我的数据库中涉及这些实体:USER_DEPARTMENT_ROLE
我的问题是,我如何在实体类中定义这个关系?我必须在每个独立的实体中定义一个@ManyToMany
关系吗?我知道如何定义两个表格之间的这种关系,但对于两个以上的表达式我不知道从哪里开始。
任何帮助表示赞赏!
如果你有超过两个关系映射到你的连接表,那么我会建议创建一个单独的实体,将用于映射该特定的表。
问题是你是否可以拥有一个独特的id列作为人造主键,或者你必须坚持使用三个外键的复合主键构建。
如果你可以添加人工ID(这是设计数据库的现代的方式),那么你的映射看起来应该像下面这样:
选项1
class User {
@OneToMany(mappedBy = "user", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Department{
@OneToMany(mappedBy = "department", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Role{
@OneToMany(mappedBy = "role", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> 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;
}
关于设置级联类型的许多到许多relatioship是棘手的,对许多涉及三个表更加棘手,因为每个实体可以扮演父母或孩子的角色取决于具体情况..我建议坚持只与cascade = {CascadeType.PERSIST, CascadeType.MERGE}
和处理其他操作马努盟友。
如果你留在复合主键,那么你应该添加额外的ID类和更改链接实体如下:
选项2
class User {
@OneToMany(mappedBy = "linkPk.user", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Department{
@OneToMany(mappedBy = "linkPk.department", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> userDepartmentRoleLinks;
}
class Role{
@OneToMany(mappedBy = "linkPk.role", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
private Set<UserDepartmentRoleLink> 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;
底线是,你可以使用Many To许多这里像这篇文章中概述 - >example。但是在我看来,如果你像上面那样映射链接表,你会为自己节省很多头痛。最后通话是你的。