我有父/子一对多的单向关系。 父POJO和子POJO都使用通过 @SQLInsert 注释指定的自定义 Insert-on-duplicate-update 插入查询。
通过级联插入父/子对 - 一切正常,实体管理器关闭。 然后我创建一个新的实体管理器,并尝试插入相同的父/子对,但使用更新的值(相同的主键,但其他一些字段已更改)。
父母的插入重复更新工作得很好,值也会更新。 然而,在子表中,我们最终得到2个条目,一个包含旧值和NULL parent_id外键,另一个包含新值并正确设置FK。
我查看了Hibernate生成的查询,发现了以下内容:
是否有一种方法可以级联插入以插入子行并在同一查询中设置FK,从而无需运行单独的更新查询?
答案 0 :(得分:1)
这个问题作为我的另一个问题的一部分得到了回答: JPA insert parent/child results in MySQLIntegrityConstraintViolationException
基本上,你必须在指定的@JoinColumn中设置nullable = false
来创建父/子关系。
由于某种原因,似乎仍然存在更新查询,但是使用insert语句插入了完整的记录。
答案 1 :(得分:1)
接受的答案并没有解决我的问题。
将updatable = false添加到父实体解决了它。 JPA不执行更新查询。但是,我不知道为什么会这样,事实上,我不认为我在做什么是正确的,因为这意味着如果必须的话我以后不能更新子表。