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中使用@Version或LockMode.Optimistic或两者都实现乐观锁定_Java_Hibernate_Optimistic Locking - Fatal编程技术网

Java 在Hibernate中使用@Version或LockMode.Optimistic或两者都实现乐观锁定

Java 在Hibernate中使用@Version或LockMode.Optimistic或两者都实现乐观锁定,java,hibernate,optimistic-locking,Java,Hibernate,Optimistic Locking,我读到,我们可以使用@version在hibernate中使用version字段实现乐观锁定。然后在阅读了有关悲观锁定的内容后,我了解到,org.hibernate.LockMode类有一些选项,如LockMode.OPTIMISTIC等,我们可以在session.load()中指定这些选项 所以我的问题是我是否需要使用锁模式。乐观的以及版本?是的。它们一起工作,您可以使用@Version而不使用LockMode.OPTIMISTIC,但不能使用LockMode.OPTIMISTIC而不使用@V

我读到,我们可以使用
@version
在hibernate中使用version字段实现乐观锁定。然后在阅读了有关悲观锁定的内容后,我了解到,
org.hibernate.LockMode
类有一些选项,如
LockMode.OPTIMISTIC
等,我们可以在
session.load()
中指定这些选项


所以我的问题是我是否需要使用锁模式。乐观的以及版本?

是的。它们一起工作,您可以使用
@Version
而不使用
LockMode.OPTIMISTIC
,但不能使用
LockMode.OPTIMISTIC
而不使用
@Version

使用乐观锁定,无论何时修改实体,该实体的版本列都会递增。保存实体时,它确保版本列与第一次读取实体时相同,如果没有,则抛出
OptimisticLockException
(这通常会导致事务重新启动)

有时,您可能需要“更改”实体而不真正更改它。这往往是相当罕见的。例如,假设有一个
Foo
对象,它有一个
mode
字段和一个
Bar
对象,它有一个
volume
字段。如果
模式
响亮
音量可以为0-100。如果
模式
静音
音量
只能为0-10

如果一个用户将
模式
(从
大声
更改为
安静
),同时另一个用户将
音量
(从5更改为50),则乐观锁定可能会使您处于不良状态。这是因为第一个用户增加并检查
Foo
实体上的版本列,而第二个用户增加并检查
Bar
实体上的版本列

一种解决方案是让
changeVolume
函数在
Foo
对象上获得
LockMode.OPTIMISTIC
锁。这告诉Hibernate,即使此函数不修改
Foo
对象,它仍然需要递增并检查版本字段