Jpa中的@ManyToMany实现增删

前言

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

示例

表结果

建立一个sys_user_group表

less 复制代码
@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表

less 复制代码
@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;

}

关联三方表

ini 复制代码
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);
}

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

bash 复制代码
userGroup.setUserList(users);

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

scss 复制代码
userGroup.getUserList().addAll(userList);

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

移除用户
scss 复制代码
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提供的关联注解功能倒是强大,可以帮助节省一些事情,但是技术选型就看自己擅长

相关推荐
学长毕设8 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
滴滴答答哒9 小时前
ASP.NET Core + FaceRecognitionDotNet 人脸识别实战:DI 单例、特征向量持久化与 1:N 比对
后端·asp.net
步行cgn9 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
霸道流氓气质11 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
captain37611 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
步行cgn12 小时前
Spring MVC + Thymeleaf 模板解析失败:从 500 错误到页面正常显示
java·spring·mvc
IT_陈寒13 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
泡海椒13 小时前
05-雷达图多维画像-信用评级多维画像
后端
王中阳Go13 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型
大哥430913 小时前
Modbus 的"字序":一个配错就变成天文数字,或者干脆变成 0
后端