一尘不染

Java-JPA-@Version批注

java

@Version批注在JPA中如何工作?

我找到了各种答案,摘录如下:

JPA使用实体中的版本字段来检测对同一数据存储记录的并发修改。当JPA运行时检测到尝试同时修改同一记录的尝试时,它将向尝试最后提交的事务抛出异常。

但是我仍然不确定它是如何工作的。


同样从以下几行开始:

您应该考虑版本字段是不变的。更改字段值会产生不确定的结果。

这是否意味着我们应该将version字段声明为final


阅读 227

收藏
2020-09-08

共1个答案

一尘不染

但是我仍然不确定它是如何工作的?

假设一个实体MyEntity具有带注释的version属性:

@Entity
public class MyEntity implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    @Version
    private Long version;

    //...
}

更新时,带有注释的字段@Version将增加并添加到WHERE子句中,如下所示:

UPDATE MYENTITY SET ..., VERSION = VERSION + 1 WHERE ((ID = ?) AND (VERSION = ?))

如果WHERE子句未能匹配记录(因为同一实体已经被另一个线程更新),则持久性提供程序将抛出OptimisticLockException

这是否意味着我们应该将我们的version字段声明为final

不可以,但是您可以考虑使二传手受到保护,因为您不应该称呼它。

2020-09-08