You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SecretSanta应用多对多关联添加成员时UnsupportedOperationException解决

解决Hibernate/JPA多对多关联中添加成员时的UnsupportedOperationException异常

我正在开发一款SecretSanta(抽名字送礼)应用,目前处于测试阶段,采用Hibernate和JPA框架,Users与SecretSantaGroup实体为多对多关联关系。尝试将组创建者添加到新创建的组并更新用户组列表时,抛出java.lang.UnsupportedOperationException异常。

问题已解决,以下是具体修改措施:

解决措施

1. 重写实体Getter方法,规避不可变List问题

Hibernate默认初始化的集合可能是不可变实例(比如Collections.emptyList()),直接调用add()操作会触发异常。手动重写getGroups()和getMembers()方法,确保返回可变的ArrayList:

public List<SecretSantaGroup> getGroups() {
    if (groups == null) {
        groups = new ArrayList<>();
    }
    return groups;
}

public List<Users> getMembers() {
    if (members == null) {
        members = new ArrayList<>();
    }
    return members;
}

2. 调整组创建方法的成员添加逻辑

修改createSecretSantaGroup方法,优化双向关联的持久化逻辑,确保关联关系同步更新:

public SecretSantaGroup createSecretSantaGroup(SecretSantaGroup secretSantaGroup, UUID creatorId) {
    try {
        secretSantaGroupRepository.save(secretSantaGroup);
        Users creator = userRepository.findById(creatorId)
                .orElseThrow(() -> new SecretSantaGroupException("User not found", HttpStatus.NOT_FOUND));
        creator.setRole(Role.ADMIN);
        secretSantaGroup.setAdmin(creator);
        String uniqueUrl = generateUniqueGroupUrl(secretSantaGroup.getName(), secretSantaGroup.getId());
        secretSantaGroup.setUrl(uniqueUrl);
        SecretSantaGroup createdGroup = secretSantaGroupRepository.save(secretSantaGroup);
        createdGroup.setMembers(userRepository.findAllById(Collections.singleton(creatorId)));
        secretSantaGroupRepository.save(createdGroup);
        userRepository.save(creator);
        if (!creator.getRole().equals(Role.ADMIN)) {
            throw new SecretSantaGroupException("User does not have the appropriate role to create a group", HttpStatus.FORBIDDEN);
        }
        creator.getGroups().add(createdGroup);
        userRepository.save(creator);
        if (createdGroup.getId() == null) {
            throw new SecretSantaGroupException("Failed to create Secret Santa Group: group id is null", HttpStatus.INTERNAL_SERVER_ERROR);
        }
        return createdGroup;
    } catch (DataAccessException | ConstraintViolationException e) {
        throw new SecretSantaGroupException("Failed to create Secret Santa Group: " + e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

相关附材

异常栈信息

// 此处填入原始异常栈内容

Users实体代码(原始版本)

// 此处填入原始Users实体代码

SecretSantaGroup实体代码(原始版本)

// 此处填入原始SecretSantaGroup实体代码

最初的组创建方法代码

// 此处填入最初的createSecretSantaGroup方法代码

内容的提问来源于stack exchange,提问作者AesirDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:37:36