Spring,JPA,Hibernate:如何防止对象的时间戳被更改

时间:2013-04-29 23:10:28

标签: java nhibernate jpa

我有一个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字段得到更新。我该如何防止它发生?

感谢您的帮助!

问候。

1 个答案:

答案 0 :(得分:1)

  

JPA支持使用获得的乐观锁定版本字段   更新每次更新。该字段可以是数字或时间戳   值。 建议使用数值,因为数值更大   精确,便携,高效,易于处理   时间戳。

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


修改:

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

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

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

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

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

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

  • 除了必填字段外,您可以为该版本添加额外的专用字段。

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