由数据库生成的JPA设置时间戳记,但不是CURRENTTIME或UPDATETIME生成的时间戳记

时间:2018-12-24 06:39:03

标签: java database spring jpa

我有一堂这样的课

@Entity
@Table(name = "Event")
public class Event {

  @Transient
  public static final long MAX_TIMESTAMP = 253402214400000L; // 9999-12-31 00:00:00
  private Date creationTime;
  private Date expiryTime;
  private String otherValue;

  public Event(int timeout, String otherValue){
    this.creationTime = new Date();
    this.expiryTime = (timeout == 0 ? new Date(MAX_TIMESTAMP) : new Date(creationTime.getTime() + SECONDS.toMillis(timeout)));
    this.otherValue = otherValue;
  }
}

我在CrudRepository中调用save()方法并保存此数据。

,我有一个ScheduledExecutorService来找出一些超时事件:

@Query("SELECT t FROM Event t WHERE t.expiryTime < CURRENT_TIMESTAMP")
  List<Event> findTimeoutEvents();

此CURRENT_TIMESTAMP是数据库的时间,但不是expiryTime。这意味着我必须确保他们的时间相同。有时,应用程序和数据库不在同一台机器上,我无法确保他们的时间相同。

我可以设置数据库生成的“ expiryTime”吗?如何将参数“超时”传递给数据库。

数据库可能是postgresql或mysql。

非常感谢您。

1 个答案:

答案 0 :(得分:0)

首先,我不确定您的代码是否有效,因为java.util.Date的实例(如果到期时间为java.util.Date对象)无法与int 0进行比较。

对于生成expiryTime,是的,显然可以。查看triggers的工作方式。

我还要补充一点,如果您使用spring-boot-starter-data-jpa,则可以用creationTime注释来注释@CreationTimestamp字段。但是我个人会在数据库端将默认值设置为CURRENT_TIMESTAMP()