我有以下(简单)映射:
@Entity
public class Role {
@OneToMany( fetch = FetchType.EAGER ) private Set< Privilege > privileges;
}
我想要执行以下操作(简化):
- 我创建了一个带有
权限
实体 (P1) 的角色
(R1) - 我想创建另一个新角色 (R2) 并赋予其相同的权限 (P1)
因此,当新的 R2 创建时,它的权限集也是新的(HashSet 不是 PersistedSet),但它包含现有的 P1;看来Hibernate无法识别P1已经存在的事实并正确地保留关系
我已经已经尝试以下操作:
- 使用
entityManager.persist
和entityManager.merge
保存新角色 (R2) - 将cascade = { CascadeType.ALL }添加到Role和Privilege之间的映射
- 在保存新角色之前尝试预加载权限(以便实体存在于当前 session 中)
我还没有尝试过:
- 在映射上指定
@JoinColumn( name = "PRIV_ID")
- 手动执行更多操作(例如首先保留空角色实体并更新权限) - 最后的手段
我认为这是一个非常标准的用例,所以也许我错过了一些阻止我正确坚持这种关联的东西。 有任何想法吗? 谢谢。
最佳答案
如果两个角色可能具有相同的权限,那么它就不再是OneToMany,而是ManyToMany。因此,首先更改 privileges
集合的映射。
然后向我们展示将 P1 添加到 R2 的权限集中的代码。我怀疑您正在创建一个新的 Privilege 实例,而不是从 session 中获取 P1。
关于java - JPA(使用 Hibernate)重新连接 @OneToMany 中的现有实体 -,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9462865/