Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate合并不能将属性用作集合_Java_Hibernate_Collections_Merge - Fatal编程技术网

Java Hibernate合并不能将属性用作集合

Java Hibernate合并不能将属性用作集合,java,hibernate,collections,merge,Java,Hibernate,Collections,Merge,我不熟悉Hibernate并尝试持久化包含集合的实体 我的类用户包含一个集合属性 class User{ @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "user_id", referencedColumnName = "id") @Valid @Nullable public Set<Permission> getPermissions()

我不熟悉Hibernate并尝试持久化包含集合的实体

我的类用户包含一个集合属性

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)
    return entityManager.merge(user);
}
其他调用是不必要的,会使代码变得混乱。并且忽略
merge()
的结果,这是作为参数传递的已分离、未触及的用户的更新附加版本


另外,请注意,由于您在关联上有一个cascade ALL,以上内容不仅会更新用户字段以及与用户关联的权限。它还将合并权限。因此,作为参数传递的用户权限的状态将复制到这些权限的附加版本中,并保存在数据库中。

也许您正在替换整个集合?我发现最好获取现有集合,并对其调用.add()和.remove()来更新其内容,而不是替换整个集合

另外,您可以尝试改用@ElementCollection

@ElementCollection
@CollectionTable(name="PERMISSION",
        joinColumns={@JoinColumn(name="USER_ID")}
)
private Set<Permission> permissions;

这就是我在开始阐述之前从一开始就有的东西。这样做会导致“拥有实体实例不再引用cascade=“all delete orphan”的集合”,或者如果我更改为“OrphanRemoving=false”,则权限集不会更新。不要替换集合本身。在集合中添加和删除元素。你想做什么还不清楚。是否要修改和删除权限?我尝试了我认为您的意思,但我仅在用户中获得新权限,即使我添加了所有权限公共用户更新(用户,设置权限){for(权限p:permissions){User.getPermissions().add(p);}User mergedUser=entityManager.merge(User);返回mergedUser;}如果您只需要这些权限,则应在添加新权限之前执行
User.getPermissions().clear()
。删除旧权限并添加新权限。我尝试了我认为你的意思,但我只在用户中获得新权限,即使我添加了所有权限@Transactional(readOnly=false)@Override public User update(User-User,Set-permissions){for(Permission p:permissions){User.getPermissions().add(p);}User mergedUser=entityManager.merge(用户);返回mergedUser;}
@ElementCollection
@CollectionTable(name="PERMISSION",
        joinColumns={@JoinColumn(name="USER_ID")}
)
private Set<Permission> permissions;
 select p from User u join u.permissions p where p.name=?