在Spring + JPA中更新级联子级时出现UnsupportedOperationException

时间:2017-08-06 08:27:46

标签: java spring hibernate spring-data-jpa

我在SpringBoot项目中使用OneToMany映射,而在更新子项以及父更新时遇到问题,示例代码如下所示:

User.java

@Table(name = "user")
@Entity
public class User {
    @Id
    @GeneratedValue
    private Integer id;

    @OneToMany(mappedBy = "groupUser", cascade = {CascadeType.ALL}, orphanRemoval = true)
    private List<UserGroup> userGroups = new ArrayList<>();
}

UserGroup.java

@Table(name = "user_group")
@Entity
public class UserGroup {
    @Id
    @GeneratedValue
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="user_id")
    private User groupUser; 
}

SampleUsageCode.java

    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepositry;

        @Transactaional
        public batchUpdateUsers(Collection<User> toBeSavedUsers) {
            Map<Integer, User> toBeSavedIdUserMap = toBeSavedUsers.stream()
.collect(groupBy(User::getId(), toList()));
            Collection<User> existingUsers = userRepositry.findByIdIn(toBeSavedIdUserMap.entrySet().stream()
.map(Map.Entry::getKey).collect(toList()));
            existingUsers.forEach(user -> user.getUserGroups().add(toBeSavedIdUserMap.get(user.getId()).getUserGroups()));
        }
    }

为了简化问题,让我们假设待保存用户中的用户组与数据库中的现有用户组完全不同。问题是当我尝试向现有用户添加新用户组时,它会抛出java.lang.UnsupportedOperationExceptionpersistentBag中的userGroups User类型似乎不可编辑。 我尝试创建一个新的集合来存储现有用户组和新用户组,但是当我尝试保存更新的用户时,会出现另一个A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance错误。如何实现这种级联 - 子项合并要求?

1 个答案:

答案 0 :(得分:1)

所以问题是由我为测试准备的用户组列表是不可修改的

引起的