JPA(使用Hibernate)在@OneToMany中重新接收现有实体 -

时间:2012-02-27 09:43:48

标签: java hibernate jpa orm one-to-many

我有以下(简单)映射:

@Entity
public class Role {
   @OneToMany( fetch = FetchType.EAGER ) private Set< Privilege > privileges;
}

我想做以下(简化):

  • 我创建了Role(R1)与Privilege实体(P1)
  • 我想创建另一个新角色(R2)并赋予它相同的权限(P1)

因此,当创建新的R2时,它的权限集也是新的(HashSet not PersistedSet),但它包含现有的P1;似乎 Hibernate无法识别P1已经存在并且正确地保持关系的事实

我已经已经尝试跟随:

  • 使用entityManager.persistentityManager.merge
  • 保存新角色(R2)
  • 将cascade = {CascadeType.ALL}添加到Role and Privilege
  • 之间的映射
  • 在保存新角色之前尝试预加载权限(以便实体存在于当前会话中)

我还没试过(还):

  • 在映射
  • 上指定@JoinColumn( name = "PRIV_ID" )
  • 手动执行更多操作(如首先保留空角色实体并更新权限) - 最后的手段

我认为这是一个非常标准的用例,所以也许我错过了阻止我正确保持这种关联的东西。 有任何想法吗? 谢谢。

2 个答案:

答案 0 :(得分:1)

如果两个角色可能具有相同的权限,那么它不再是OneToMany,而是ManyToMany。首先,请更改privileges集合的映射。

然后向我们展示将P1添加到R2的特权集的代码。我怀疑您正在创建一个新的Privilege实例,而不是从会话中获取P1。

答案 1 :(得分:0)

OneToMany意味着特权具有反向链接(通过外键) - 也属于一个且仅属于一个角色,并且不能属于两个角色。您需要多对多才能实现目标