我有一个这样的模型:
@Entity
public class Event extends Model {
@Id
public long id;
public String name;
@Version
public Timestamp created;
}
在此对象上运行.save()
时,我会收到以下记录:
id | name | created
----+--------+-------------------------
1 | Foobar | 2014-11-04 20:25:40.194
如您所见,created
字段为SQL时间戳格式。是否可以将其更改为实际的BIGINT
或long
数据类型?只需将created
更改为public long
就会产生错误:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.sql.Timestamp
答案 0 :(得分:2)
根据JPA 2.0规范,第11.1.50章版本注释:
版本属性支持以下类型:int, 整数,短,短,长,长,时间戳。
如果可以删除现有的数据库模式,那么用java.sql.Timestamp
替换实体的java.lang.Long
字段并再次重新创建数据库模式就足够了,因此相应的数据库列将被替换很久。
如果无法删除现有数据库模式(即遗留数据库),那么实体可以使用构造函数从java.lang.Long
到java.sql.Timestamp
进行显式就地转换:
Timestamp created = new Timestamp(1397240740194L); //2014-11-04 20:25:40.194
Long timestamp = created.getTime();
除非确实有必要(任何用例?),否则我不建议使用java.math.BigInteger
。
旁注:
通常,使用版本指定的字段或属性 应用程序不应更新注释。
换句话说,持久化上下文负责更新版本字段/列。只有在批量更新的情况下,当省略持久性上下文并绕过乐观锁定检查时,应用程序才应该处理它。