Jpa中的@ManyToMany实现增删

136 阅读1分钟

前言

在使用jpa注解生成三方表实现增删

示例

表结果

建立一个sys_user_group

@Entity
@Data
@FieldNameConstants
@Table(name = "sys_user_group")
public class UserGroup  {

    @Id
    private Long id;
    
    
    private String name;



    @ManyToMany
    @JsonManagedReference
    @JoinTable(name = "sys_user_group_rel", joinColumns = { @JoinColumn(name = "user_group_id") }, inverseJoinColumns = {@JoinColumn(name = "user_id")})
    private List<User> userList;

}

建立一个user

@Entity
@Table(name = "sys_user")
@Data
@FieldNameConstants
public class User {
   
    @Id
    private Long id;
     
    private String phoneNo;

  


    @ManyToMany
    @JoinTable(name = "sys_user_group_rel", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {@JoinColumn(name = "user_group_id")})
    private List<UserGroup> userGroupList;

}

关联三方表

public void addUserToUserGroup(AddUserToUserGroupDto addUserToUserGroupDto) {
    if (CollectionUtils.isEmpty(addUserToUserGroupDto.getUserIds())) {
        return;
    }
    UserGroup userGroup = this.findById(addUserToUserGroupDto.getUserGroupId())
            .orElseThrow(() -> new BusinessException("用户组不存在"));
    addUserToUserGroupDto.getUserIds().removeIf(e -> userGroup.getUserList().stream().anyMatch(e1 -> e1.getId().equals(e)));
    if (CollectionUtils.isEmpty(addUserToUserGroupDto.getUserIds())) {
        return;
    }
    List<User> userList = iUserRepository.findByIdIn(addUserToUserGroupDto.getUserIds());
    if (CollectionUtils.isEmpty(userList)) {
        return;
    }
    List<User> users = new ArrayList<>(10);
    userList.forEach(user -> {
        User user1 = new User();
        user1.setId(user.getId());
        users.add(user1);
    });
    userGroup.setUserList(users);
    this.save(userGroup);
}

这个方法是一直往关联表新增用户和用户组关联关系,但是使用了

userGroup.setUserList(users);

image.png 待会会执行delete语句,就是把查到的userGroup之前的数据删除,新增对用的users 备注: 如果不想删除之前的数据,使用

userGroup.getUserList().addAll(userList);

这样就不会把userGroup之前的数据删除,会新增新加的users

image.png

移除用户
public void removeUserToUserGroupDto(RemoveUserToUserGroupDto removeUserToUserGroupDto) {
    if (CollectionUtils.isEmpty(removeUserToUserGroupDto.getUserIds())) {
        return;
    }
    UserGroup userGroup = this.findById(removeUserToUserGroupDto.getUserGroupId())
            .orElseThrow(() -> new BusinessException("用户组不存在"));
    userGroup.setUserList(userGroup.getUserList().stream().filter(u -> !removeUserToUserGroupDto.getUserIds().contains(u.getId())).collect(Collectors.toList()));
    save(userGroup);
}

将userGroup查到的user过滤掉,然后重新save就可以了

总结

JPA提供的关联注解功能倒是强大,可以帮助节省一些事情,但是技术选型就看自己擅长