#java #mysql #sql #hibernate
#java #MySQL #sql #спящий режим
Вопрос:
У меня есть таблицы User, Roles, Groups и объединенная таблица GroupRoles. У пользователя может быть много ролей (некоторые из которых не являются специфичными для группы), а у группы может быть много ролей. Поскольку роли могут быть связаны с группой, мне нужно связать с ними groupId, и, следовательно, GroupRoles имеет уникальный ключ userId, groupId и RoleId. Мне нужен идентификатор пользователя как часть ключа, поскольку мне нужно знать, какие роли связаны с пользователем. В hibernate сопоставляет уникальный ключ, подобный этому, так же, как сопоставление составного ключа, где у меня было бы что-то вроде
@Embeddable
public class GroupRoleKey implements Serializable {
@Column(name="userID")
private Long userID;
@Column(name="groupID")
private Long groupID;
@Column(name="roleID")
private Long roleID;
protected GroupRoleKey(){}
public GroupRoleKey(Long userID, Long roleID, Long groupID) {
this.userID = userID;
this.roleID = roleID;
this.groupID = groupID
}
Честно говоря, я не уверен, что это даже лучший способ представления отношения User — Role — Group, любые советы будут оценены. Мне нужно отобразить роли пользователей в каждой группе, к которой они принадлежат, например, я могу захотеть отобразить роли Боба Admin и Teacher для группы 1 и роли администратора группы для группы 2. Мне нужно знать, какие роли соответствуют какой группе и какие роли соответствуют какому пользователю.
Редактировать:
Групповая сущность:
@Table(name="FocusGroups")
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
property = "groupID")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long groupID;
private String groupName;
@ManyToMany
@JoinTable(name = "GroupMembers",
joinColumns = @JoinColumn(
name = "groupID"),
inverseJoinColumns = @JoinColumn(
name = "userID"))
private Set<User> groupMembers = new HashSet<>();
@ManyToMany
@JoinTable(name = "GroupRoles",
joinColumns =
@JoinColumn(
name = "groupID"),
inverseJoinColumns = @JoinColumn(
name = "roleID"))
private Set<Role> roles = new HashSet<>();
@ManyToOne(fetch = FetchType.EAGER, optional = true)
@JoinColumn(name="frameworkID", nullable = true)
private Framework framework;
public Group(){}
public Group(String groupName, Set<User> groupMembers, Framework framework) {
this.groupName = groupName;
this.groupMembers = groupMembers;
this.framework = framework;
}
public Long getGroupID() {
return groupID;
}
public void setGroupID(Long groupID) {
this.groupID = groupID;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
public Set<User> getGroupMembers() {
return groupMembers;
}
public void setGroupMembers(Set<User> groupMembers) {
this.groupMembers = groupMembers;
}
public void addMembers(Set<User> groupMembers){
this.groupMembers.addAll(groupMembers);
}
public void addMember(User groupMember){
this.groupMembers.add(groupMember);
}
public String groupMembersToString(){
String out = "";
int count = 0;
if(groupMembers.size() > 0){
for(User user: groupMembers){
if(count >= 1){
out = ", ";
}
out = user.getUsername();
count ;
}
}else{
out = "No members";
}
return out;
}
public boolean hasMember(String groupMemberName) {
for (User member : this.groupMembers) {
if (member.getUsername().equals(groupMemberName)) {
return true;
}
}
return false;
}
public User getGroupMember(String groupMemberName){
for(User member: this.groupMembers){
if(member.getUsername().equals(groupMemberName)){
return member;
}
}
return null;
}
public Framework getFramework() {
return framework;
}
public void setFramework(Framework framework) {
this.framework = framework;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
}
Роль:
@Entity
@Table(name = "Roles")
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long roleID;
private String roleName;
@ManyToMany
@JoinTable(name = "GroupRoles",
joinColumns =
@JoinColumn(
name = "roleID"),
inverseJoinColumns = @JoinColumn(
name = "groupID", nullable = true))
private Set<Group> groups = new HashSet<>();
protected Role(){}
public Role(String roleName){
this.roleName = roleName;
}
public Long getId() {
return roleID;
}
public void setId(Long id) {
this.roleID = id;
}
public String getName() {
return roleName;
}
public void setName(String roleName) {
this.roleName = roleName;
}
}
Пользователь:
@Table(name="Users")
@Entity
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(
name = "userRating",
procedureName = "CalculateUserRating",
parameters = {
@StoredProcedureParameter(
name = "userID",
type = Long.class,
mode = ParameterMode.IN),
@StoredProcedureParameter(
name = "focusID",
type = Long.class,
mode = ParameterMode.IN),
@StoredProcedureParameter(
name = "userRating",
type = BigDecimal.class,
mode = ParameterMode.OUT)
})
})
//store a base rating?
public class User {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long userID;
@Column(name = "userHashedPassword")
private String password;
@Column(name = "userName")
private String userName;
@Column(name = "userEmail")
private String email;
@ManyToMany
@JoinTable(name = "GroupMembers",
joinColumns = @JoinColumn(
name = "userID"),
inverseJoinColumns = @JoinColumn(
name = "groupID"))
private Set<Group> usersGroups = new HashSet<>();
@ManyToMany
@JoinTable(name = "UserRoles",
joinColumns = @JoinColumn(
name = "userID"),
inverseJoinColumns = @JoinColumn(
name = "roleID"))
private Set<Role> roles = new HashSet<>();
@OneToMany(mappedBy = "user")
private Set<Rating> ratings;
protected User(){}
public User(String userHashedPassword, String userName, String email, Set<Role> roles){
this.password = userHashedPassword;
this.userName = userName;
this.email = email;
this.roles = roles;
}
public User(String userName, String userHashedPassword){
this.userName = userName;
this.password = userHashedPassword;
}
public Long getUserId() {
return userID;
}
public void setId(Long userID) {
this.userID = userID;
}
public String getPassword(){
return password;
}
public void setPassword(String password){
this.password = password;
}
public String getUsername() {
return userName;
}
public void setUsername(String name) {
this.userName = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
public Set<Rating> getRatings() {
return ratings;
}
public void setRatings(Set<Rating> ratings) {
this.ratings = ratings;
}
public String rolesToString(){
String outputRoles = "";
int count = 0;
for(Role role: roles){
if(count >= 1){
outputRoles = ", ";
}
outputRoles = role.getName();
count ;
}
return outputRoles;
}
public void removeRole(Role role){
this.roles.remove(role);
}
public Set<Group> getGroups() {
return usersGroups;
}
public void addGroup(Group group) {
this.usersGroups.add(group);
}
public void addGroups(Set<Group> groups) {
this.usersGroups.addAll(groups);
}
public Set<Group> getUsersGroups() {
return usersGroups;
}
public void setUsersGroups(Set<Group> usersGroups) {
this.usersGroups = usersGroups;
}
public String groupsToString(){
String outputGroups = "";
int count = 0;
if(usersGroups.size() > 0){
for(Group group: usersGroups){
if(count >= 1){
outputGroups = ", ";
}
outputGroups = group.getGroupName();
count ;
}
}else{
outputGroups = "None";
}
return outputGroups;
}
}
Комментарии:
1. Можете ли вы рассказать нам более подробно о ваших требованиях? Пожалуйста, предоставьте весь класс сущности вместе с их отображением. И вам действительно нужна роль и группа вместе. Вы можете использовать любой из них (например, роль / группу)
2. @Numery я соответствующим образом скорректировал свой вопрос