Skip to content

Commit 86e273f

Browse files
committed
修复jpa多对多重复数据问题
1 parent 9d69afd commit 86e273f

File tree

7 files changed

+62
-67
lines changed

7 files changed

+62
-67
lines changed

backstage/src/main/java/com/cn/controller/SystemController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,21 @@ public String managerDetail(@PathVariable Long managerId, Model model) {
8484
@GetMapping("/manager/edit.html")
8585
public String altManager(@AuthenticationPrincipal Manager managerDetail, @RequestParam(required = false) Long managerId, Model model) {
8686
//最好是从当前授权信息里面提出角色列表来
87-
List<Role> currentManagerRoles = managerDetail.getRoleList();
87+
Set<Role> currentManagerRoles = managerDetail.getRoleList();
8888
String optRole = currentManagerRoles.stream().map(role -> role.getId().toString()).collect(Collectors.joining(","));
8989

9090
Manager manager;
9191
String checkRoleIds;
92-
List<Role> beSelectedRoles;
92+
Set<Role> beSelectedRoles;
9393
if (managerId != null) {
9494
manager = managerService.getManagerById(managerId);
9595
checkRoleIds = manager.getRoleList().stream().map(role ->
9696
role.getId().toString()).collect(Collectors.joining(","));
97-
beSelectedRoles = Stream.concat(currentManagerRoles.stream(), manager.getRoleList().stream()).toList();
97+
beSelectedRoles = Stream.concat(currentManagerRoles.stream(), manager.getRoleList().stream()).collect(Collectors.toSet());
9898
} else {
9999
manager = new Manager();
100100
checkRoleIds = "";
101-
beSelectedRoles = Collections.unmodifiableList(currentManagerRoles);
101+
beSelectedRoles = Collections.unmodifiableSet(currentManagerRoles);
102102
}
103103
model.addAttribute("currentId", managerDetail.getId());
104104
model.addAttribute("manager", manager);

music_story.sql

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -99,32 +99,32 @@ insert into `permission`(`id`,`icon`,`name`,`parent_id`,`parent_ids`,`http_meth
9999
(7,'&#xe653;','音书管理',0,'0','GET','menu',1,''),
100100
(8,'&#xe60e;','公告列表',7,'0/7','GET','menu',3,'/ms/notice.html'),
101101
(9,'&#xe66f;','用户列表',7,'0/7','GET','menu',0,'/ms/user.html'),
102-
(10,'','新增',2,'0/1/2','POST','button',1,'/sys/manager'),
103-
(11,'','删除',2,'0/1/2','DELETE','button',3,'/sys/manager'),
104-
(12,'','新增',3,'0/1/3','POST','button',1,'/sys/menu'),
105-
(13,'','删除',3,'0/1/3','DELETE','button',3,'/sys/menu'),
106-
(14,'','修改',6,'0/1/6','PUT','button',2,'/sys/role'),
107-
(15,'','删除',6,'0/1/6','DELETE','button',3,'/sys/role'),
108-
(16,'','重置密码',2,'0/1/2','POST','button',4,'/sys/manager/pwd'),
109-
(17,'&#xe705;','文章列表',7,'0/7','GET','menu',1,'/ms/essay.html'),
110-
(18,'','修改',2,'0/1/2','PUT','button',2,'/sys/manager'),
111-
(19,'','授权',6,'0/1/6','POST','button',4,'/sys/role/grant'),
112-
(20,'','修改',3,'0/1/3','PUT','button',2,'/sys/menu'),
113-
(21,'','新增',6,'0/1/6','POST','button',1,'/sys/role'),
114-
(22,'&#xe634;','轮播图',7,'0/7','GET','menu',4,'/ms/carousel.html'),
115-
(23,'&#xe60a;','分类列表',7,'0/7','GET','menu',2,'/ms/classify.html'),
102+
(10,'&#xe705;','文章列表',7,'0/7','GET','menu',1,'/ms/essay.html'),
103+
(11,'&#xe60a;','分类列表',7,'0/7','GET','menu',2,'/ms/classify.html'),
104+
(12,'&#xe634;','轮播图',7,'0/7','GET','menu',4,'/ms/carousel.html'),
105+
(13,'','新增',2,'0/1/2','POST','button',1,'/sys/manager'),
106+
(14,'','删除',2,'0/1/2','DELETE','button',3,'/sys/manager'),
107+
(15,'','新增',3,'0/1/3','POST','button',1,'/sys/menu'),
108+
(16,'','删除',3,'0/1/3','DELETE','button',3,'/sys/menu'),
109+
(17,'','修改',6,'0/1/6','PUT','button',2,'/sys/role'),
110+
(18,'','删除',6,'0/1/6','DELETE','button',3,'/sys/role'),
111+
(19,'','重置密码',2,'0/1/2','POST','button',4,'/sys/manager/pwd'),
112+
(20,'','修改',2,'0/1/2','PUT','button',2,'/sys/manager'),
113+
(21,'','授权',6,'0/1/6','POST','button',4,'/sys/role/grant'),
114+
(22,'','修改',3,'0/1/3','PUT','button',2,'/sys/menu'),
115+
(23,'','新增',6,'0/1/6','POST','button',1,'/sys/role'),
116116
(24,'','删除',9,'0/7/9','DELETE','button',1,'/ms/user'),
117117
(25,'','修改',9,'0/7/9','PUT','button',0,'/ms/user'),
118118
(26,'','新增',23,'0/7/23','POST','button',0,'/ms/classify'),
119119
(27,'','修改',23,'0/7/23','PUT','button',1,'/ms/classify'),
120120
(28,'','删除',23,'0/7/23','DELETE','button',2,'/ms/classify'),
121-
(44,'','新增',8,'0/7/8','POST','button',0,'/ms/notice'),
122-
(45,'','修改',8,'0/7/8','PUT','button',1,'/ms/notice'),
123-
(46,'','删除',8,'0/7/8','DELETE','button',2,'/ms/notice'),
124-
(47,'','新增',22,'0/7/22','POST','button',0,'/ms/carousel'),
125-
(48,'','修改',22,'0/7/22','PUT','button',1,'/ms/carousel'),
126-
(49,'','删除',22,'0/7/22','DELETE','button',2,'/ms/carousel'),
127-
(50,'','审核',17,'0/7/17','POST','button',0,'/ms/essay');
121+
(29,'','新增',8,'0/7/8','POST','button',0,'/ms/notice'),
122+
(30,'','修改',8,'0/7/8','PUT','button',1,'/ms/notice'),
123+
(31,'','删除',8,'0/7/8','DELETE','button',2,'/ms/notice'),
124+
(32,'','新增',12,'0/7/12','POST','button',0,'/ms/carousel'),
125+
(33,'','修改',12,'0/7/12','PUT','button',1,'/ms/carousel'),
126+
(34,'','删除',12,'0/7/12','DELETE','button',2,'/ms/carousel'),
127+
(35,'','审核',10,'0/7/10','POST','button',0,'/ms/essay');
128128

129129
/*Data for the table `persistent_logins` */
130130

@@ -147,18 +147,18 @@ insert into `role_permission`(`role_id`,`permission_id`) values
147147
(1,26),
148148
(1,27),
149149
(1,8),
150-
(1,44),
151-
(1,46),
152-
(1,45),
150+
(1,33),
151+
(1,34),
152+
(1,35),
153153
(1,9),
154154
(1,24),
155155
(1,25),
156156
(1,22),
157-
(1,48),
158-
(1,47),
159-
(1,49),
157+
(1,29),
158+
(1,30),
159+
(1,31),
160160
(1,17),
161-
(1,50),
161+
(1,32),
162162
(1,1),
163163
(1,2),
164164
(1,16),
@@ -181,15 +181,15 @@ insert into `role_permission`(`role_id`,`permission_id`) values
181181
(2,26),
182182
(2,27),
183183
(2,8),
184-
(2,45),
185-
(2,44),
184+
(2,28),
185+
(2,29),
186186
(2,9),
187187
(2,25),
188188
(2,22),
189-
(2,48),
190-
(2,47),
189+
(2,30),
190+
(2,31),
191191
(2,17),
192-
(2,50),
192+
(2,32),
193193
(2,1),
194194
(2,2),
195195
(2,10),

repository/src/main/java/com/cn/entity/Manager.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.time.LocalDateTime;
1717
import java.util.Collection;
1818
import java.util.HashSet;
19-
import java.util.List;
19+
import java.util.Set;
2020

2121
/**
2222
* 客服管理员实体
@@ -77,7 +77,8 @@ public class Manager extends AbstractDateAudit implements UserDetails, Credentia
7777
/**
7878
* 一个用户具有多个角色
7979
* 立即从数据库中进行加载数据;
80-
* todo 此处有个bug 会出现多条重复数据
80+
* 此处使用set 会比list 性能好 同时也能避免一些重复数据的坑
81+
* jpa官方也建议使用set 因为list在一对多、多对多 等场景下有很多各种各样的坑
8182
*/
8283
@ManyToMany(fetch = FetchType.EAGER)
8384
@JoinTable(
@@ -86,7 +87,7 @@ public class Manager extends AbstractDateAudit implements UserDetails, Credentia
8687
inverseJoinColumns = @JoinColumn(name = "role_id")
8788
)
8889
@Where(clause = "available=true")
89-
private List<Role> roleList;
90+
private Set<Role> roleList;
9091

9192
@Transient
9293
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -113,7 +114,7 @@ public class Manager extends AbstractDateAudit implements UserDetails, Credentia
113114
public Collection<? extends GrantedAuthority> getAuthorities() {
114115
Collection<GrantedAuthority> authorities = new HashSet<>();
115116
SimpleGrantedAuthority authority;
116-
for (Role role : this.getRoleList()) {
117+
for (Role role : roleList) {
117118
authority = new SimpleGrantedAuthority(String.join("_","ROLE", role.getRoleCode()));
118119
authorities.add(authority);
119120
for (Permission permission : role.getPermissions()) {

repository/src/main/java/com/cn/entity/Permission.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import lombok.Setter;
66

77
import javax.persistence.*;
8-
import java.util.List;
8+
import java.util.Set;
99

1010
/**
1111
* 后台资源实体类
@@ -41,7 +41,7 @@ public class Permission extends MenuDTO {
4141
/**
4242
* 菜单与角色 多对多
4343
*/
44-
private List<Role> roles;
44+
private Set<Role> roles;
4545

4646
/**
4747
* 资源类型
@@ -100,7 +100,7 @@ public Integer getSort() {
100100
}
101101

102102
@ManyToMany(mappedBy = "permissions")
103-
public List<Role> getRoles() {
103+
public Set<Role> getRoles() {
104104
return roles;
105105
}
106106

repository/src/main/java/com/cn/entity/Role.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
import lombok.Setter;
77

88
import javax.persistence.*;
9-
import java.util.List;
109
import java.util.Objects;
10+
import java.util.Set;
1111

1212
/**
1313
* 角色实体
@@ -60,13 +60,13 @@ public class Role extends AbstractUserDateAudit {
6060
* 用户 - 角色关系定义; 用户-角色 多对多
6161
*/
6262
@ManyToMany(mappedBy = "roleList")
63-
private List<User> userInfoList;
63+
private Set<User> userInfoList;
6464

6565
/**
6666
* 管理员 - 角色关系定义; 管理员-角色 多对多
6767
*/
6868
@ManyToMany(mappedBy = "roleList")
69-
private List<Manager> managers;
69+
private Set<Manager> managers;
7070

7171
/**
7272
* 角色 -- 权限关系:多对多关系;
@@ -78,7 +78,7 @@ public class Role extends AbstractUserDateAudit {
7878
inverseJoinColumns = @JoinColumn(name = "permission_id")
7979
)
8080
@OrderBy("sort asc")
81-
private List<Permission> permissions;
81+
private Set<Permission> permissions;
8282

8383

8484
@Override

service/src/main/java/com/cn/ManagerService.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx
4242
Manager manager = managerRepository.findManagerByUsername(username).orElseThrow(() -> new UsernameNotFoundException("用户不存在"));
4343
if(Manager.ADMIN.equals(manager.getUsername())) {
4444
//admin 直接开挂加载所有
45-
manager.setRoleList(roleService.getAvailableRoles(Role.ROLE_TYPE_MANAGER));
45+
manager.setRoleList(new HashSet<>(roleService.getAvailableRoles(Role.ROLE_TYPE_MANAGER)));
4646
}
4747
return manager;
4848
}
@@ -54,7 +54,7 @@ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundEx
5454
* @return Manager
5555
*/
5656
public Manager getManagerById(Long managerId) {
57-
return managerRepository.getReferenceById(managerId);
57+
return managerRepository.findById(managerId).orElseThrow();
5858
}
5959

6060
/**
@@ -76,11 +76,11 @@ public Page<Manager> getManagersList(Pageable pageable, Manager manager) {
7676
*/
7777
@Transactional(rollbackFor = Exception.class)
7878
public void saveManager(Manager curManager, Manager updateManager) {
79-
List<Role> roleList = curManager.getRoleList();
79+
Set<Role> roleList = curManager.getRoleList();
8080
//获取被修改人之前的角色-当前人的角色=必存角色 最后结果为必存角色+回传角色
81-
Set<Role> allRole = new HashSet<>(roleList);
81+
Set<Role> allRole = new HashSet<>(curManager.getRoleList());
8282

83-
List<Role> roles = new ArrayList<>();
83+
Set<Role> roles = new HashSet<>();
8484
if (Objects.nonNull(updateManager.getId())) {
8585
Manager manager = managerRepository.getReferenceById(updateManager.getId());
8686
//判断是否当前人在改自己的信息

service/src/main/java/com/cn/RoleService.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,9 @@ public void saveRole(Role role) {
8080
@Transactional(rollbackFor = Exception.class)
8181
public void saveGrant(long roleId, String menuIds) {
8282
Role role = roleRepository.getReferenceById(roleId);
83-
List<Permission> permissions = permissionRepository.findMenuList();
84-
List<Permission> permissionList = new ArrayList<>();
85-
String[] permissionIds = menuIds.split(",");
86-
for (String permissionId : permissionIds) {
87-
for (Permission permission : permissions) {
88-
if (permissionId.equals(permission.getId().toString())) {
89-
permissionList.add(permission);
90-
}
91-
}
92-
}
93-
role.setPermissions(permissionList);
83+
List<Long> ids = Arrays.stream(menuIds.split(",")).map(Long::valueOf).toList();
84+
List<Permission> permissionList = permissionRepository.findAllById(ids);
85+
role.setPermissions(new HashSet<>(permissionList));
9486
}
9587

9688
/**
@@ -126,6 +118,7 @@ public List<Permission> getPermissionList() {
126118

127119
/**
128120
* 获取菜单列表
121+
*
129122
* @return List<MenuDTO>
130123
*/
131124
public List<Permission> getMenuList() {
@@ -135,13 +128,14 @@ public List<Permission> getMenuList() {
135128

136129
/**
137130
* 获取带有勾选状态的 菜单列表
131+
*
138132
* @param roleId 角色id
139133
* @return Set<MenuDTO>
140134
*/
141-
public Collection<MenuDTO> getMenuListWithChecked(long roleId){
135+
public Collection<MenuDTO> getMenuListWithChecked(long roleId) {
142136
List<Permission> permissions = permissionRepository.findMenuList();
143-
List<Permission> rolePermissions = roleRepository.getReferenceById(roleId).getPermissions();
144-
return MenuUtil.checkMenuSelected(permissions,rolePermissions);
137+
Set<Permission> rolePermissions = roleRepository.getReferenceById(roleId).getPermissions();
138+
return MenuUtil.checkMenuSelected(permissions, rolePermissions);
145139
}
146140

147141
/**

0 commit comments

Comments
 (0)