Java JPA-将@Version保存为长数据类型
我有一个这样的模型:Java JPA-将@Version保存为长数据类型,java,jpa,timestamp,Java,Jpa,Timestamp,我有一个这样的模型: @Entity public class Event extends Model { @Id public long id; public String name; @Version public Timestamp created; } 在此对象上运行.save()时,我得到以下记录: id | name | created ----+--------+-------------------------
@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
如您所见,创建了
字段作为SQL时间戳格式。是否可以将其更改为实际的BIGINT
或long
数据类型?只需将创建的更改为public long
就会产生错误:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.sql.Timestamp
根据JPA 2.0规范第11.1.50章版本注释:
版本属性支持以下类型:int,
整数,短,短,长,长,时间戳
- 如果可以删除现有的数据库模式,那么用
java.lang.Long
替换实体的java.sql.Timestamp
字段并重新创建数据库模式就足够了,因此相应的数据库列将被替换为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.biginger
,除非确实需要(任何用例?)
旁注:
通常,使用版本指定的字段或属性
应用程序不应更新批注
换句话说,持久性上下文负责更新版本字段/列。只有在忽略持久性上下文并绕过乐观锁定检查的情况下进行批量更新时,应用程序才应该处理它。删除数据库不是问题。我已将模型更改为使用@Version public Long created
,但该字段现在为每个记录填充1
,而不是像System.getCurrentTimeMillis()
这样的内容。有什么想法吗?一般规则是:每次在基础数据库中更新实体时,其版本字段将增加一个。尝试更新现有实体和调用刷新/提交。