小编Mik*_*mau的帖子

@Version 为 null 时乐观锁失败

我正在编写一些代码来生成序列号。我将读取并更新数据库中的一条记录,该记录保存下一个要生成的数字。由于我期望有不同的线程访问此记录,因此我只是将 @Version 标签添加到同一实体的 Timestamp 字段中,然后控制可能出现的 OptimisticLockExceptions。

另外,我的数据库中会有几条这样的记录,其中包含不同的序列号,可以根据业务创建或删除它们。

域对象如下所示:

@Entity
@Table(name="Preferences")
public class Preferences implements Serializable, DomainObject {
...
...
@Column(name="nextSerial")
private String nextSerial;

@Version
@Column(name="RefreshDate")
private Timestamp refreshDate;
...
Run Code Online (Sandbox Code Playgroud)

直到这里一切正常,当共享相同数据的另一个应用程序创建首选项记录时,问题就出现了。构建此应用程序时,@Version 列不存在,因此它将创建带有 Null 值作为刷新日期的记录。

我知道这一点,我尝试设置刷新日期并更新记录,还尝试删除并再次创建记录,但无论如何,我都会收到如下异常:

org.springframework.orm.jpa.JpaOptimisticLockingFailureException:异常 [EclipseLink-5001](Eclipse 持久性服务 - 2.6.1.v20150916-55dc7c3):org.eclipse.persistence.exceptions.OptimisticLockException 异常描述:尝试删除对象[com.core.domain.Preferences@5e092f04],但它在身份映射中没有版本号。

所以我的问题是,如何从我的应用程序中处理这个问题?在数据库中使用触发器来确保非空 @Version 是不可取的,更改其他应用程序也是不可取的。

java optimistic-locking spring-data

2
推荐指数
1
解决办法
2852
查看次数

标签 统计

java ×1

optimistic-locking ×1

spring-data ×1