Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA-将@Version保存为长数据类型_Java_Jpa_Timestamp - Fatal编程技术网

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()
这样的内容。有什么想法吗?一般规则是:每次在基础数据库中更新实体时,其版本字段将增加一个。尝试更新现有实体和调用刷新/提交。