Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在单个查询中使用FK更新现有JPA子实体_Java_Mysql_Hibernate_Jpa - Fatal编程技术网

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

Java 在单个查询中使用FK更新现有JPA子实体,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我有一个父母/孩子一对多的单向关系。 父POJO和子POJO都在通过@SQLInsert annotation指定的重复更新插入查询上使用自定义插入 父/子对通过级联插入-一切正常,实体管理器关闭。 然后,我创建一个新的实体管理器,并尝试插入相同的父/子对,但具有更新的值(相同的主键,但其他一些字段已更改) 父级的“重复更新时插入”工作正常,值也会更新。 然而,在子表中,我们得到了两个条目,一个是旧值和NULL parent_id外键,另一个是新值并正确设置了FK 我查看了Hibernate生成

我有一个父母/孩子一对多的单向关系。 父POJO和子POJO都在通过@SQLInsert annotation指定的重复更新插入查询上使用自定义插入

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

父级的“重复更新时插入”工作正常,值也会更新。 然而,在子表中,我们得到了两个条目,一个是旧值和NULL parent_id外键,另一个是新值并正确设置了FK

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

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

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

该问题作为我的另一个问题的一部分得到了回答:

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


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

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

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