【问题标题】:Updating existing JPA child entities with FK in a single query在单个查询中使用 FK 更新现有 JPA 子实体
【发布时间】:2016-02-20 12:02:03
【问题描述】:

我有一个父/子一对多的单向关系。 父 POJO 和子 POJO 都使用通过 @SQLInsert 注释指定的自定义 Insert-on-duplicate-update 插入查询。

通过级联插入父/子对 - 一切正常,实体管理器已关闭。 然后我创建一个新的实体管理器并尝试插入相同的父/子对,但具有更新的值(相同的主键,但其他一些字段已更改)。

父级的 Insert-on-duplicate-update 工作得很好,并且值已更新。 然而,在子表中,我们最终得到了 2 个条目,一个具有旧值和 NULL parent_id 外键,另一个具有新值并正确设置了 FK。

我查看了 Hibernate 生成的查询,发现如下:

  • 插入子行,外键设置为 NULL
  • 然后运行更新查询,为给定的子 ID 设置 parent_id
  • 运行另一个更新,将 parent_id 设置为 NULL,我假设第一行的子 ID
  • 运行设置 parent_id 的第三个更新查询

有没有办法级联插入插入子行并在同一个查询中设置FK,从而无需运行单独的更新查询?

【问题讨论】:

    标签: java mysql hibernate jpa


    【解决方案1】:

    接受的答案没有解决我的问题。

    向父实体添加 updateable=false 解决了这个问题。 JPA 不执行更新查询。但是,我不知道为什么会这样,事实上,我认为我所做的并不正确,因为这意味着如果我必须在以后更新子表。

    【讨论】:

      【解决方案2】:

      这个问题作为我另一个问题的一部分得到了回答: JPA insert parent/child results in MySQLIntegrityConstraintViolationException

      基本上,您必须在指定创建父/子关系的@JoinColumn 中设置nullable = false

      由于某种原因,似乎仍在运行更新查询,但正在使用插入语句插入完整的记录。

      【讨论】:

        猜你喜欢
        • 2019-02-09
        • 2014-08-13
        • 1970-01-01
        • 2011-01-21
        • 2019-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多