java - Hibernate 合并不适用于属性作为集合

标签 java hibernate collections merge

我是 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/

相关文章:

java - 如何在android中制作自定义Arrays.asList

java - int 数组到 BufferedImage

java - 使用基于数据库的 ID 生成器 "Sequence"或 "Table HiLow"

Scala 集合 : Using a value of Set find the key from a Map object.

java - 无法使用 Gradle 在 IntelliJ Community Edition 中添加应用程序服务器

java - 泛型类使用泛型参数

java - org.hibernate.MappingNotFoundException 异常

java - 如何为JPA和Hibernate创建一个persistence.xml文件?

java - Java 9 集合工厂的使用

java - 使用 editText 重新排序 ArrayList