我有一个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字段得到更新。我该如何防止它发生?
感谢您的帮助!
问候。
答案 0 :(得分:1)
JPA支持使用获得的乐观锁定版本字段 更新每次更新。该字段可以是数字或时间戳 值。 建议使用数值,因为数值更大 精确,便携,高效,易于处理 时间戳。强>
如文档中所述,版本字段会隐式更新。您可以在实体中拥有一个单独的字段作为版本,因为它依赖于时间戳字段&限制它更新。
修改:
乐观锁定允许并发交易&根据版本字段跟踪更改&它与实体一起更新。
在事务提交之前,检查版本字段是否已被其他事务更改,因为已读取实体。
UPDATE ENTITY SET ..., version = version+1 WHERE version = previousVersion
锁定模式PESSIMISTIC_FORCE_INCREMENT
& OPTIMISTIC_FORCE_INCREMENT
将强制版本字段递增。
悲观锁定在从数据库中提取实体时锁定数据库行。
将锁定模式指定为OPTIMISTIC
,PESSIMISTIC_READ
,PESSIMISTIC_WRITE
,不会更新版本字段。
除了必填字段外,您可以为该版本添加额外的专用字段。
否则,可以指定适当的锁定模式以防止版本字段更新。