【问题标题】:JPA (with Hibernate) reatach existing entities in a @OneToMany -JPA(使用 Hibernate)重新连接 @OneToMany 中的现有实体 -
【发布时间】:2012-03-16 19:10:19
【问题描述】:

我有以下(简单)映射:

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

我想做以下事情(简化):

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

所以,当新的 R2 创建时,它的 Set of Privilege 也是新的(HashSet 不是 PersistedSet)但它包含现有的 P1; Hibernate 似乎无法识别 P1 已经存在的事实并正确地保持关系

已经尝试过关注:

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

我还没有尝试过(还):

  • 在映射上指定@JoinColumn( name = "PRIV_ID" )
  • 手动执行更多操作(例如首先保留空的 Role 实体,然后更新 Privileges)- 最后的手段

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 虽然诊断是对的,但解释是错误的:OneToMany 可以是单向的(所以,没有反向链接),如果是这样,默认策略是使用连接表,与多到许多关联(但有一个独特的约束)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2016-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-30
      相关资源
      最近更新 更多