在单个查询中使用FK更新现有JPA子实体

时间:2015-11-18 16:30:39

标签: java mysql hibernate jpa

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

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

父母的插入重复更新工作得很好,值也会更新。 然而,在子表中,我们最终得到2个条目,一个包含旧值和NULL parent_id外键,另一个包含新值并正确设置FK。

我查看了Hibernate生成的查询,发现了以下内容:

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

是否有一种方法可以级联插入以插入子行并在同一查询中设置FK,从而无需运行单独的更新查询?

2 个答案:

答案 0 :(得分:1)

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

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

由于某种原因,似乎仍然存在更新查询,但是使用insert语句插入了完整的记录。

答案 1 :(得分:1)

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

将updatable = false添加到父实体解决了它。 JPA不执行更新查询。但是,我不知道为什么会这样,事实上,我不认为我在做什么是正确的,因为这意味着如果必须的话我以后不能更新子表。