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

相关推荐
刘一说40 分钟前
Spring Boot 中的定时任务:从基础调度到高可用实践
spring boot·后端·wpf
小坏讲微服务40 分钟前
使用 Spring Cloud Gateway 实现集群
java·spring boot·分布式·后端·spring cloud·中间件·gateway
没有bug.的程序员1 小时前
Spring Cloud Gateway 路由与过滤器机制
java·开发语言·spring boot·spring·gateway
文心快码BaiduComate1 小时前
CCF程序员大会码力全开:AI加速营,10w奖金等你拿!
前端·后端·程序员
紫穹1 小时前
012.今天我们来实现一个“自己的 GPT”
后端
tianming20191 小时前
Gogs迁移到Gitea不完全指南
git·后端
洛卡卡了1 小时前
当上传不再只是 /upload,我们是怎么设计大文件上传的
后端·面试·架构
oak隔壁找我1 小时前
Spring AI 实现MCP简单案例
java·人工智能·后端
吴祖贤1 小时前
5.2 Spring AI OpenAI 嵌入模型
后端
星光一影1 小时前
SpringBoot+Vue3无人机AI巡检系统
人工智能·spring boot·websocket·mysql·intellij-idea·mybatis·无人机