Java 当您有多个实体时,JPA@Version注释是如何工作的

Java 当您有多个实体时,JPA@Version注释是如何工作的,java,sql,hibernate,jpa,transactions,Java,Sql,Hibernate,Jpa,Transactions,假设我们使用的数据库的隔离级别设置为:read_committed 我们还使用带有@Version注释的JPA实体 我们有两个交易T和K,如下所示: T-------------------------------------K 开始 读一篇 阅读B 读C --------------------------------------开始 --------------------------------------更新A --------------------------------------

假设我们使用的数据库的隔离级别设置为:read_committed 我们还使用带有
@Version
注释的JPA实体

我们有两个交易T和K,如下所示:

T-------------------------------------K
开始
读一篇
阅读B
读C
--------------------------------------开始
--------------------------------------更新A
--------------------------------------结束
更新C
使用
对象A和对象B
结束

在事务T中的这一点上,C的更新是成功的(版本检查很好),因此我们正在使用一个在事务T上从未真正存在过的状态来更新C DB

我的理解有什么问题

编辑:

@弗拉德

考虑这个例子:

T--------------------------------------------K

启动事务
读一篇
-----------------------------------------------启动事务
-----------------------------------------------模块A
-----------------------------------------------模块B
-----------------------------------------------结束交易
阅读C版本=1
读B

//使用数据da A和B
//更新C
A、 B->C
//更新成功(检查版本是否正常)

结束交易

使用乐观的力量,你基本上是在告诉我
始终使用“查找”方法并将此选项设置为正确

乐观锁定仅适用于单个表行。在这种特殊情况下,可以成功更新实体
C
,因为第二个事务不会对其进行修改

如果要在此处创建冲突,则必须使用以下乐观锁定请求之一:


这样,在第二个事务中,无论何时更新实体
A
,都会触发
C

中的版本增量,非常感谢!我认为不需要,但我很高兴听到你的消息?在交易结束时自动调用Flush,所以你不需要;我还有最后一个疑问:假设我们使用hibernate findById加载en entity,并使用Option Option\u FORCE\u INCREMENT选项,然后将实体序列化到客户端(此处为长对话),当客户端将实体返回给服务器时,我是否应该创建一个附加实体,手动设置verion,然后调用merge?很抱歉打扰你;)一旦你通过练习尝试所有这些例子,你将会学到更多。用我的钱。祝你好运