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