当前位置: 首页 > 知识库问答 >
问题:

在Hibernate中替换父级的最佳方法

洪开诚
2023-03-14

我有 2 个实体(父实体和子实体),它们之间具有一对多关系。

“父项具有子项列表”,“子项具有父项”字段。

孩子有

 @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST})

在父字段中。

家长有

@OneToMany(mappedBy="parent", cascade = CascadeType.ALL, orphanRemoval = true)

在子列表中。

我想找到一种方法,用另一个家长替换一个孩子的家长。(即将子女A的父母从父母A变更为父母B)

因为我想遵循父列表,所以我想从列表中删除子项。问题是,即使我首先将ChildA添加到ParentB的列表中,也要将ChildA的Parent字段设置为ParentB,然后才能将其从ParentA的Child列表中删除,因为它会完全删除Child(显然是因为OrphanRemove)

如何在不更改Hibernate配置并从 ParentA 的列表中删除(孤立删除等)的情况下进行此交换?

编辑

我宁愿避免使用entityManager.flush()

共有1个答案

西门安民
2023-03-14

尝试这种方式(ChildA将ParentA作为父母):

  1. 加载父母A
  2. 将ChildA父级设置为NULL
  3. 拯救儿童A
  4. 关闭或刷新会话
  5. 打开会话
  6. 将父母B设置为孩子A
  7. 合并儿童A(使用合并不保存/更新/保存OrUpdate)

我认为步骤4和5可能没有必要,但我不确定,你必须托盘。

也许4和5个步骤你可以替换为:session.evict(父母)

 类似资料:
  • 这是我的数组: 但我想这样换键:

  • 问题内容: 我的应用程序是带有密集字符串处理的多线程。我们正在经历过多的内存消耗,并且性能分析表明这是由于String数据引起的。我认为使用某种flyweight模式实现甚至是缓存将极大地受益于内存消耗(我可以肯定Strings通常是重复的,尽管我在这方面没有任何硬数据)。 我看过Java常量池和String.intern,但似乎可以引发一些PermGen问题。 在Java中实现应用程序范围的多线

  • 问题内容: 由于HTML5中不推荐使用HTML中的标记(我理解为什么),有没有一种将某些属性和样式仅应用于段落文本 部分 的干净解决方案?我使用JavaScript来解析XML文件,该事实依赖于标签允许使用基于类的CSS格式化部分包装文本的事实。我意识到“ anchor”()标记也可以用于此目的,但是这种方式看起来非常落后且不自然。 编辑 当我问这个问题时(几年前),我未能理解每个DOM元素都属于

  • 问题内容: 我需要替换一些字符,如下所示:,… 我编码如下,但是我想应该有一些更好的方法。有什么提示吗? 问题答案: 替换两个字符 我给当前答案中的所有方法加上了一个额外的时间。 使用输入字符串并替换和,最快的方法是将替换链接在一起,如下所示:。 每个功能的时间: a)1000000次循环,每个循环最好为3:1.47 s b)1000000个循环,每个循环的最佳时间为3:1.51μs c)1000

  • 问题内容: 我正在寻找Java中字符串查找和替换的最佳方法。 这句话是这样的:“我叫米兰,人们把我称为米兰·瓦西奇​​”。 我想用Milan Vasic代替字符串Milan,但是在我已经拥有Milan Vasic的地方,不应该这样。 搜索/替换后的结果应为:“我叫Milan Vasic,人们称我为Milan Vasic”。 我曾尝试使用indexOf()以及Pattern / Matcher组合,

  • 问题内容: 给出下表 给定一个,我需要找到其顶级父级()。 每天执行50-100次此查询。当前有100-200行(将来可能会更多)。多达8个层次的深度。我在考虑三种选择: 使用递归方法 创建一个视图 添加另一列(最不满意) 哪个效率最高? 问题答案: SQL2008 +: 为了存储层次结构,SQL Server包含HIERARCHYID数据类型。可以将上述数据“转换为”以使用“值”: 转换后,我将