我是 Hibernate 新手,尝试保留包含集合的实体。
我的 User 类包含一个 Set 属性。
class User{
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "user_id", referencedColumnName = "id")
@Valid
@Nullable
public Set<Permission> getPermissions()
{
return permissions;
}
}
当我用一组新的权限更新用户并尝试保存它时,权限会再次重置为原始值,所有其他值都会更新,只有未更新的权限。
@Transactional(readOnly = false)
@Override
public User update(User user)
entityManager.merge(user);
entityManager.flush();
entityManager.refresh(user);
return user;
我已经阅读了有关传递持久性和分离对象的内容,但我仍然无法让它发挥作用。
知道我做错了什么吗?
最佳答案
尝试使用
@Transactional(readOnly = false)
@Override
public User update(User user)
return entityManager.merge(user);
}
其他调用是不必要的,并且会使您的代码变得困惑。并且您忽略 merge()
的结果,它是分离的、未触及的、用户作为参数传递的更新的附加版本。
另请注意,由于您在关联上具有级联 ALL,因此上述内容不仅会更新用户字段以及与该用户关联的权限。它还将合并权限。因此,作为参数传递的用户权限状态将被复制到这些权限的附加版本并保存在数据库中。
关于java - Hibernate 合并不适用于属性作为集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11560733/