请教spring-data-jdbc 多对多映射关系的处理

spring-data-jdbc 可以处理1对1,1对多的业务场景,
但是如果碰到多对多映射关系,应该要怎么弄呢?请各位大虾分享点思路,谢谢啦~~

@OneToMany和@ManyToMany注解
或者使用@JoinTable注解来定义多对多关系,并使用一个关联实体

【以下回答由 GPT 生成】

对于多对多关系,spring-data-jdbc提供了一种简单的处理方式,可以通过使用嵌入式Entity来实现。下面是一种常见的处理方式:

  1. 首先,定义相应的实体类。
@Table("users")
@Data
class User {
    @Id
    private Long id;
    private String name;

    @Embedded(onEmpty = EMPTY)
    private Set<UserRole> roles;
}

@Table("roles")
@Data
class Role {
    @Id
    private Long id;
    private String name;

    @Embedded(onEmpty = EMPTY)
    private Set<UserRole> users;
}

@Data
class UserRole {
    private Long userId;
    private Long roleId;
}
  1. 接着,定义相应的Repository接口。
interface UserRepository extends CrudRepository<User, Long> {
}

interface RoleRepository extends CrudRepository<Role, Long> {
}
  1. 然后,业务逻辑中可以利用spring-data-jdbc提供的方法来对多对多关系进行操作。
@Service
class UserService {
    private final UserRepository userRepository;
    private final RoleRepository roleRepository;

    public UserService(UserRepository userRepository, RoleRepository roleRepository) {
        this.userRepository = userRepository;
        this.roleRepository = roleRepository;
    }

    public void assignRole(Long userId, Long roleId) {
        User user = userRepository.findById(userId);
        Role role = roleRepository.findById(roleId);

        if (user != null && role != null) {
            UserRole userRole = new UserRole();
            userRole.setUserId(user.getId());
            userRole.setRoleId(role.getId());

            if (user.getRoles() == null) {
                user.setRoles(new HashSet<>());
            }
            if (role.getUsers() == null) {
                role.setUsers(new HashSet<>());
            }

            user.getRoles().add(userRole);
            role.getUsers().add(userRole);

            userRepository.save(user);
            roleRepository.save(role);
        }
    }

    public void removeRole(Long userId, Long roleId) {
        User user = userRepository.findById(userId);
        Role role = roleRepository.findById(roleId);

        if (user != null && role != null) {
            UserRole userRole = user.getRoles().stream()
                    .filter(r -> r.getRoleId().equals(roleId))
                    .filter(r -> r.getUserId().equals(userId))
                    .findFirst()
                    .orElse(null);

            if (userRole != null) {
                user.getRoles().remove(userRole);
                role.getUsers().remove(userRole);

                userRepository.save(user);
                roleRepository.save(role);
            }
        }
    }
}
  1. 最后,你可以在你的业务代码中使用这些方法来进行多对多关系的操作。
@Service
class MyService {
    private final UserService userService;

    public MyService(UserService userService) {
        this.userService = userService;
    }

    public void assignRoleToUser(Long userId, Long roleId) {
        userService.assignRole(userId, roleId);
    }

    public void removeRoleFromUser(Long userId, Long roleId) {
        userService.removeRole(userId, roleId);
    }
}

这样,你就可以利用spring-data-jdbc来处理多对多映射关系了。希望对你有帮助!如果还有其他问题,请随时提问。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^