我有以下实体。意味着用户可以属于许多企业,并且对于每个企业,此用户可以拥有单独的权限。因此可以将现有用户分配给另一个企业。 Business_User表如下所示:
USER_ID BUSINESS_ID AUTHORITY_NAME 6 1 ROLE_ANALYTICS 6 1 ROLE_SELF_ANALYTICS 7 1 ROLE_REVIEWS 8 1 ROLE_ANALYTICS 8 1 ROLE_SELF_ANALYTICS 8 1 ROLE_REVIEWS 6 2 ROLE_REVIEWS 6 2 ROLE_SELF_ANALYTICS
问题:我通过尝试构建用户DTO对象列表来查询用户的一项业务,DTO公开了List<Authority>
,问题是我无法弄清楚我应该如何获得Business_User表中每个用户的这些权限。一直试图用lambdas做奇特的东西,但没有运气。我使用Spring Data进行查询,也许可以在存储库中解决它。
提前致谢。
编辑:如果我想通过添加新的联接表BUSINESS_USER_AUTHORITY
去另一条路线,我将如何在UserBusiness
课程中对其进行描述?我也希望主键超过user_id和business_id。请注意,name
是Authority
表中的PK。
这样的东西,但这根本不会创建我的联接表。
更改 UserBusiness 类:
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "BUSINESS_USER_AUTHORITY",
joinColumns = {@JoinColumn(name = "business_user_id", referencedColumnName = "id")},
inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
private Set<Authority> authorities = new HashSet<>();
用户
@Entity
@Table(name = "USER")
public class User extends AbstractAuditingEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(cascade = CascadeType.ALL)
@JoinColumns({
@JoinColumn(name = "user_id", referencedColumnName = "id")
})
private Set<BusinessUser> businessUsers = new HashSet<>();
}
BusinessUser
@Entity
@Table(name = "BUSINESS_USER")
@IdClass(BusinessUser.class)
public class BusinessUser implements Serializable {
@Id
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User user;
@Id
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "business_id")
private Business business;
@Id
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "authority_name")
private Authority authority;
}
商家
@Entity
@Table(name = "BUSINESS")
public class Business implements Serializable {
@OneToMany(cascade = CascadeType.ALL)
@JoinColumns({
@JoinColumn(name = "business_id", referencedColumnName = "id")
})
private Set<BusinessUser> businessUsers = new HashSet<>();
}
授权
@Entity
@Table(name = "AUTHORITY")
public class Authority implements Serializable {
@NotNull
@Size(min = 0, max = 50)
@Id
@Column(length = 50)
private String name;
}
答案 0 :(得分:0)
我最终编写了这样的函数,但是如果有人有解决方案,那么DesignUser&lt; - &gt;之间的另一个连接表将如何看待设计? BusinessUserAuthority然后我很乐意实现它。
private Function<Map.Entry<User, List<BusinessUser>>, UserManagementDTO> getPermissionForUser() {
return user -> {
UserManagementDTO dto = userManagementMapper.userToUserManagementDTO(user.getKey());
dto.setAuthorities(user.getValue().stream().map(BusinessUser::getAuthority).collect(Collectors.toSet()));
return dto;
};
}