我在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.UnsupportedOperationException
。 persistentBag
中的userGroups
User
类型似乎不可编辑。
我尝试创建一个新的集合来存储现有用户组和新用户组,但是当我尝试保存更新的用户时,会出现另一个A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance
错误。如何实现这种级联 - 子项合并要求?
答案 0 :(得分:1)
所以问题是由我为测试准备的用户组列表是不可修改的
引起的