Java Hibernate合并不能将属性用作集合
我不熟悉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()
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=?