2013-04-29 66 views
1

我有一个Spring + JPA(Hibernate)Web应用程序。Spring,JPA,Hibernate:如何防止更改对象的时间戳

我有具有以下字段的类:

private Date updatedTime; 

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

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

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

感谢您的帮助!

问候。

回答

1

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

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


编辑:

乐观锁允许&跟踪基于该版本字段&它与实体一起更新的变化并发事务。

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

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

锁定模式PESSIMISTIC_FORCE_INCREMENT & OPTIMISTIC_FORCE_INCREMENT将迫使版本字段递增。

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

指定锁定模式为OPTIMISTICPESSIMISTIC_READ,PESSIMISTIC_WRITE,它不会更新版本字段。

  • 除了必填字段之外,您可以为版本提供额外的专用字段。

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

+0

嗨Nayan,非常感谢您的支持。我会考虑使用版本字段的数字值。但我的意图是阻止版本字段在我的情况下得到更新。在我的情况下,数字版本字段是否会更新? “你的意思是依赖于时间戳字段并限制它不被更新。” ?再次感谢! – curious1 2013-05-02 01:14:59

+0

@ curious1我已更新帖子并提供更多信息,请参阅编辑部分。 – 2013-05-02 05:08:21

相关问题