我正在开发一个包含用户帐户的网络应用。我有三个系统角色和几个用户。我已经用这种方式实现了它(简化以便更好地理解):
@Table(name = "user")
public class User {
@Id
private String id;
@Column(name = User.COLUMN_LOGIN)
private String login;
@Column(name = User.COLUMN_PASSWORD)
private String password;
@ManyToMany(cascade = CascadeType.DETACH, fetch = FetchType.EAGER)
@JoinTable(name = "role_to_user",
joinColumns={@JoinColumn(name = "userId")},
inverseJoinColumns={@JoinColumn(name = "roleId")})
private Set<Role> roles = new LinkedHashSet<Role>();
}
@Table(name = "role")
public class Role {
@Id
private String id;
@Column(name = Role.COLUMN_ROLETYPE)
private int roletype;
}
将角色分配给用户的日期和结束此分配的日期的最佳方法是什么?我的想法是将列startDate和endDate添加到名为role_to_user
的绑定表中,但我不知道如何告诉它休眠:)
这个好主意还是有更好的方法吗?
谢谢,Ondrej
答案 0 :(得分:1)
你的设计假设是正确的。有人说,在现实生活中,多对多关系非常罕见。你需要第三个表/对象,我们称之为“RoleAssignment”:
@Entity
@Table(name = "role_to_user")
public class RoleAssignment {
@ManyToOne
private User user;
@ManyToOne
private Role role;
private Date startDate;
private Date endDate;
}
当然,需要在User
课程中进行一些调整:
@ManyToMany()
private Set<RoleAssignment> roles = new HashSet<>();
现在,您可以从User
导航到Role
并在此期间过滤无效角色。