java - JPA(使用 Hibernate)重新连接 @OneToMany 中的现有实体 -

标签 java hibernate jpa orm one-to-many

我有以下(简单)映射:

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

我想要执行以下操作(简化):

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

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

我已经已经尝试以下操作:

  • 使用 entityManager.persistentityManager.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/

相关文章:

java - OpenJDK 11 和 macOS 不支持 ZGC?

java - 查询包含 java.sql.Date 列的表时,Jpa findAll() 会导致错误

mysql - 如何在事务回滚中恢复自动ID

java - Hibernate:在 spring jpa 存储库中按字段排序的额外交叉连接

java - Java中的Web日志分析

java - ElasticSearch 事件监听器

java - 在 GAE 上使用 Siena 时如何编写单元测试

java - 用于事务重用的 Hibernate 模式

spring - 枚举值不保留为 EnumType.STRING,而是保留为子实体的 ORDINALvalue

java - 提供值列表作为 Hibernate 搜索中的搜索条件