1

我有一个 Spring + JPA (Hibernate) Web 应用程序。

我有一个具有以下字段的类:

private Date updatedTime;

@Version
@Temporal(TemporalType.TIMESTAMP)
public Date getUpdatedTime() {
    return updatedTime;
}

public void setUpdatedTime(Date lastUpdatedTime) {
    this.updatedTime = lastUpdatedTime;
}

在服务层的事务方法中,我需要加载这个类的一个实例并在将其所有属性复制(通过 XStream)到同一类的新实例之前对其进行修改(我必须遵循这个顺序,因为我没有想要将旧实例中的一些不需要的大数据字段(集合字段,其中包含该类的每个实例唯一的“详细”对象)复制到新实例)。当新实例保存到数据库时,该方法返回。现在旧实例的 updatedTime 字段得到更新。我怎样才能防止它发生?

感谢帮助!

问候。

4

1 回答 1

1

JPA 支持使用在每次更新时更新的乐观锁定版本字段。该字段可以是数字或时间戳值。建议使用数值,因为数值比时间戳更精确、可移植、高性能且更易于处理。

如文档中所述,版本字段会隐式更新。您可以在实体中拥有一个单独的字段作为版本,因为依赖于时间戳字段 & 来限制它的更新。


编辑 :

乐观锁定允许并发事务并根据版本字段跟踪更改并与实体一起更新。

在事务提交之前,检查版本字段是否已被其他事务更改,因为实体已被读取。

UPDATE ENTITY SET ..., version = version+1 WHERE version = previousVersion

锁定模式PESSIMISTIC_FORCE_INCREMENT&OPTIMISTIC_FORCE_INCREMENT将强制版本字段递增。

悲观锁定会在从数据库中获取实体时锁定数据库行。

将锁定模式指定为OPTIMISTIC, PESSIMISTIC_READPESSIMISTIC_WRITE不会更新版本字段。

  • 除了必填字段之外,您还可以为版本设置一个额外的专用字段。

  • 否则,可以指定适当的锁定模式以防止版本字段被更新。

于 2013-04-30T06:38:33.630 回答