我正在处理一些生成序列号的代码。我将读取并更新数据库中的记录,该记录包含要生成的下一个数字。由于我希望有不同的线程访问此记录,我只是将@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;
...
直到这里一切正常,当共享相同数据的另一个应用程序创建首选项记录时,问题就出现了。构建此应用程序时,@ Version列并不存在,因此它将创建一个Null值为refreshDate的记录。
我知道这一点,我尝试设置一个refreshDate并更新记录,也尝试删除并再次创建记录,但无论如何,我会得到一个像下一个的例外:
org.springframework.orm.jpa.JpaOptimisticLockingFailureException: 例外[EclipseLink-5001](Eclipse持久性服务 - 2.6.1.v20150916-55dc7c3):org.eclipse.persistence.exceptions.OptimisticLockException异常 说明:尝试删除该对象 [com.core.domain.Preferences@5e092f04],但它没有版本 身份图中的数字。
所以我的问题是,如何从我的应用程序中处理这个问题?使用数据库中的触发器来确保非零@Version是不可取的,也不需要更改其他应用程序。
答案 0 :(得分:1)
您可以使用数据库方法在创建时为refreshDate设置默认值吗?喜欢
VERSION BIGINT NOT NULL DEFAULT 1 - 对于数字版本
RefreshDate TIMESTAMP NOT NULL DEFAULT now() - 适用于您的情况