【问题标题】:JPA/Hibernate prevent merge firing select query for childrenJPA/Hibernate 防止合并触发子级选择查询
【发布时间】:2021-10-09 17:45:32
【问题描述】:

我有一个批处理来更新表 A 中的实体(实体具有预先生成的 id)并将子实体插入到表 B(生成的 id)中。

在批处理作业运行之前,表 A 将始终被填充,表 B 将始终为空。

我想要实体 A 和 B 之间的双向关系(对其他批处理很有用),但是在父 A 上调用 entitymanager.merge 会导致 B 和 A 的选择语句。这是不必要的,因为 B 将始终是新记录并使用 entitymanager.persist 单独插入。这确实会影响性能,因为有多个子集合(称为 C),因此对 B 和 C 有不必要的选择。

我希望在子集合上仅使用 Cascade.PERSIST 可以在 A 上调用合并时阻止这些选择,但似乎并非如此。

这是否可能,或者,正如我目前正在做的那样,是删除 @OneToMany 关系并在父方仅使用 @ManyToOnes 的唯一解决方案?

【问题讨论】:

    标签: hibernate jpa


    【解决方案1】:

    这就是为什么如果您知道要插入新记录,则永远不要使用merge。在这种情况下,您应该使用persist 操作来避免选择语句。

    【讨论】:

    • 我无法使用持久化,因为表 A 中可能已经存在一条记录,因此首先使用合并的原因。我最终从 entitymanager 获取了休眠会话并调用 session.saveOrUpdate,它只对父实体执行选择
    • 我不知道用例,但你可以尝试使用persist,如果失败则运行另一个更新的事务。
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2015-10-02
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多