JPA - 将@Version保存为数据类型long

时间:2014-11-04 23:32:54

标签: java jpa timestamp

我有一个这样的模型:

@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时间戳格式。是否可以将其更改为实际的BIGINTlong数据类型?只需将created更改为public long就会产生错误:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.sql.Timestamp

1 个答案:

答案 0 :(得分:2)

根据JPA 2.0规范,第11.1.50章版本注释:

  

版本属性支持以下类型:int,   整数,短,短,长,长,时间戳。

  • 如果可以删除现有的数据库模式,那么用java.sql.Timestamp替换实体的java.lang.Long字段并再次重新创建数据库模式就足够了,因此相应的数据库列将被替换很久。

  • 如果无法删除现有数据库模式(即遗留数据库),那么实体可以使用构造函数从java.lang.Longjava.sql.Timestamp进行显式就地转换:

    Timestamp created = new Timestamp(1397240740194L); //2014-11-04 20:25:40.194
    Long timestamp = created.getTime();
    

    除非确实有必要(任何用例?),否则我不建议使用java.math.BigInteger


旁注:

  

通常,使用版本指定的字段或属性   应用程序不应更新注释。

换句话说,持久化上下文负责更新版本字段/列。只有在批量更新的情况下,当省略持久性上下文并绕过乐观锁定检查时,应用程序才应该处理它。