Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.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 如何在提交之前将hibernate查询从插入更改为更新_Java_Hibernate - Fatal编程技术网

Java 如何在提交之前将hibernate查询从插入更改为更新

Java 如何在提交之前将hibernate查询从插入更改为更新,java,hibernate,Java,Hibernate,hibernate执行INSERT查询而不是UPDATE时出现问题 背景:我们并行运行两个长期事务,修改同一个表。当事务运行时,我们使用entityManager.merge(),但最后只在提交之前刷新数据库。 因此,事务a成功提交。几分钟后,当事务b尝试刷新时,由于公共表中存在重复的键而导致失败 我们假设当事务b合并时,事务a尚未提交,实体尚未写入数据库,因此创建了插入查询。但是,事务a在事务b之前提交,并将实体插入数据库,因此此时我们需要更改事务b中的查询以进行更新。 有什么建议吗?因为您使

hibernate执行
INSERT
查询而不是
UPDATE
时出现问题

背景:我们并行运行两个长期事务,修改同一个表。当事务运行时,我们使用
entityManager.merge()
,但最后只在提交之前刷新数据库。
因此,事务a成功提交。几分钟后,当事务b尝试刷新时,由于公共表中存在重复的键而导致失败
我们假设当事务b合并时,事务a尚未提交,实体尚未写入数据库,因此创建了
插入
查询。但是,事务a事务b之前提交,并将实体插入数据库,因此此时我们需要更改事务b中的查询以进行更新。


有什么建议吗?

因为您使用的是Hibernate而不是纯JPA,所以可以使用
会话#saveOrUpdate
。您可以使用
session session=entityManager.unwrap(session.class)访问Hibernate会话

因为您使用的是Hibernate而不是纯JPA,所以可以使用
会话#保存或更新
。您可以使用
session session=entityManager.unwrap(session.class)访问Hibernate会话

谢谢,但我想merge就是这么做的,不是吗?它们的行为略有不同。要使
merge
工作,entityManager需要知道对象存在。它不会先检查数据库。作为使用Hibernate会话的替代方法,请参见以下回答:谢谢,但我认为merge正在做什么,不是吗?它们的行为略有不同。要使
merge
工作,entityManager需要知道对象存在。它不会先检查数据库。作为使用Hibernate会话的替代方法,请参见以下答案: