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

相关推荐
高兴达4 分钟前
RPC--Netty客户端实现
java·spring·rpc
重庆小透明30 分钟前
力扣刷题记录【1】146.LRU缓存
java·后端·学习·算法·leetcode·缓存
博观而约取1 小时前
Django 数据迁移全解析:makemigrations & migrate 常见错误与解决方案
后端·python·django
寻月隐君2 小时前
Rust 异步编程实践:从 Tokio 基础到阻塞任务处理模式
后端·rust·github
GO兔2 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
Sincerelyplz2 小时前
【Temproal】快速了解Temproal的核心概念以及使用
笔记·后端·开源
爱上语文2 小时前
Redis基础(6):SpringDataRedis
数据库·redis·后端
Lemon程序馆2 小时前
速通 GO 垃圾回收机制
后端·go
Aurora_NeAr2 小时前
Spark SQL架构及高级用法
大数据·后端·spark
杰尼橙子2 小时前
DPDK BPF:将eBPF虚拟机的灵活性带入到了DPDK的高性能用户态
后端·性能优化