可选的<timestamp>元素指明了表中包含时间戳数据。 这用来作为版本的替代。时间戳本质上是一种对乐观锁定的一种不是特别安全的实现。当然, 有时候应用程序可能在其他方面使用时间戳。

<timestamp
        column="timestamp_column"                                    (1)
        name="propertyName"                                          (2)
        access="field|property|ClassName"                            (3)
        unsaved-value="null|undefined"                               (4)
        source="vm|db"                                               (5)
        generated="never|always"                                     (6)
        node="element-name|@attribute-name|element/@attribute|."
/>
(1)

column (可选 - 默认为属性名): 持有时间戳的字段名。

(2)

name: 在持久化类中的JavaBeans风格的属性名, 其Java类型是 Date 或者 Timestamp的。

(3)

access (可选 - 默认是 property): Hibernate用于访问属性值的策略。

(4)

unsaved-value (可选 - 默认是null): 用于标明某个实例时刚刚被实例化的(尚未保存)版本属性值,依靠这个值就可以把这种情况和 已经在先前的session中保存或装载的脱管(detached)实例区分开来。(undefined 指明使用标识属性值进行这种判断。)

(5)

source (可选 - 默认是 vm): Hibernate如何才能获取到时间戳的值呢?从数据库,还是当前JVM?从数据库获取会带来一些负担,因为Hibernate必须访问数据库来获得“下一个值”,但是在集群环境中会更安全些。还要注意,并不是所有的Dialect(方言)都支持获得数据库的当前时间戳的,而支持的数据库中又有一部分因为精度不足,用于锁定是不安全的(例如Oracle 8)。

(6)

generated (可选 - 默认是 never): 指出时间戳值是否实际上是由数据库生成的.请参阅第 5.6 节 “数据库生成属性(Generated Properties)”的讨论。

注意,<timestamp><version type="timestamp">是等价的。并且<timestamp source="db"><version type="dbtimestamp">是等价的。