Table of Contents
背景介绍
@Version是jpa里提供的一个注解,其作用是用于实现乐观锁。在JPA的帮助下实现乐观锁十分简单,只需将我们的一个java的entity加上一个由@version修饰的字段即可。然后我们每次去对这个entity进行更新操作的时候,JPA就会去比较这个version并且在操作成功之后自动更新它,若version与当前数据库的不匹配,则更新操作失败并抛出下面这个异常javax.persistence.OptimisticLockException。
下面是一个使用注解@Version的entity的例子代码
@Entity
@Table(name = "PRODUCT")
public class Product {
@Id
@Column(name = "ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@NotNull
@Column(name = "NAME")
private String name;
@Version
@Column(name = "VERSION")
private Integer version;
...
}
在这个例子当中,我们定义了一个Integer类型的version作为用于检测的字段。这是比较常见的方式,还有一种方式是定义一个Date类型的字段作为检测的字段,使用哪种类型通常取决于所使用的jpa实现以及每个应用程序的实际情况。在JPA的帮助下,我们只需要按上述定义我们的Entity,就能实现乐观锁的效果。
那么JPA是如何实现乐观锁的呢?这是本篇博客主要想要探究的问题。
什么是JPA
在介绍乐观锁之前我们不妨先来看一下JPA是个什么样的东西。JPA全称是Java Persistence API,这是一套用来持久化存储数据到数据库的类和方法的集合。JPA主要是为了减轻程序员为关系对象编写代码的负担,使用JPA框架允许与数据库实例轻松交互。由于JPA本身只是一套开源的API,因此很多企业都有对它进行自己的实现,我们比较常见的包括Hibernate, Eclipselink, Toplink, Spring Data JPA等等。知道了JPA的作用之后,我们就更好理解为什么它会来实现数据更新的乐观锁的相关功能了。