Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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_Oracle Sqldeveloper_Hibernate Criteria - Fatal编程技术网

Java Hibernate更新查询混淆

Java Hibernate更新查询混淆,java,hibernate,oracle-sqldeveloper,hibernate-criteria,Java,Hibernate,Oracle Sqldeveloper,Hibernate Criteria,我用多个线程运行java应用程序,这些线程将从oracle数据库查询,若条件满足,它将更新行。但多个线程很有可能获得同一行的相同状态,然后多个线程尝试更新同一行 假设任何一行的状态为“已接受”,则将其更新为“正在处理”状态,然后开始处理,但处理只应由更新此记录的一个线程完成 一种方法是查询数据库,若状态为“已接受”,则更新记录,我需要编写同步java方法,但这将阻止多线程。所以我想在这种情况下使用sql方式 Hibernate更新方法返回类型为void。所以我无法找到行是现在更新了还是已经更新了

我用多个线程运行java应用程序,这些线程将从oracle数据库查询,若条件满足,它将更新行。但多个线程很有可能获得同一行的相同状态,然后多个线程尝试更新同一行

假设任何一行的状态为“已接受”,则将其更新为“正在处理”状态,然后开始处理,但处理只应由更新此记录的一个线程完成

一种方法是查询数据库,若状态为“已接受”,则更新记录,我需要编写同步java方法,但这将阻止多线程。所以我想在这种情况下使用sql方式


Hibernate更新方法返回类型为void。所以我无法找到行是现在更新了还是已经更新了。在这种情况下,hibernate中是否有任何更新选择或锁定功能可以帮助我。

您可以通过@Version很好地使用乐观锁定

请看下面的帖子:


您可以通过@Version很好地利用乐观锁定

请看下面的帖子:


我认为你的问题与

除此之外,我还想在@shankarsh提供的答案上说,如果您想使用查询而不是entitymanager或hibernate会话,则需要在查询中包含version字段,如下所示:

update t.columntoUpdate,version = version + 1 from yourEntity where yourcondition and version = :version

这样,更新只会在特定版本中成功,而所有并发更新都不会更新任何内容。

我认为您的问题与

除此之外,我还想在@shankarsh提供的答案上说,如果您想使用查询而不是entitymanager或hibernate会话,则需要在查询中包含version字段,如下所示:

update t.columntoUpdate,version = version + 1 from yourEntity where yourcondition and version = :version
这样,更新只会在特定版本中成功,而所有并发更新都不会更新任何内容