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

相关推荐
大葱白菜15 分钟前
Java 反射的作用详解:为什么说它是 Java 中最强大的特性之一?
java·后端·程序员
aircrushin16 分钟前
在 Expo 中实现 Azure SMS-OTP 登录
前端·javascript·后端
ん贤16 分钟前
GMP模型
运维·服务器·后端·golang
Code季风17 分钟前
Spring AOP 与事务管理进阶:传播行为原理与实战指南
java·spring boot·spring
绵阳的脑内SSD21 分钟前
project4踩坑经历
后端
程序员小潘21 分钟前
关于 同步异步,并发并行
后端
大葱白菜23 分钟前
Java 注解(Annotation)详解:从基础到实战,彻底掌握元数据驱动开发
java·后端·程序员
哈基咩40 分钟前
Go语言unsafe包深度解析
服务器·开发语言·后端·golang
武昌库里写JAVA1 小时前
vue+iview+i18n国际化
java·开发语言·spring boot·学习·课程设计
你我约定有三1 小时前
RabbitMQ--Springboot解决消息丢失
java·spring boot·rabbitmq·java-rabbitmq