如何在Play中创建自动生成的日期/时间戳字段!/ JPA?

rip*_*234 15 java datetime timestamp jpa playframework

我想在实体对象上添加Date/DateTime/Timestamp字段,该字段将在创建/持久化实体并设置为"now"时自动创建,永远不会再次更新.

其他用例包括始终更新为包含实体的最后修改日期的字段.

我曾经在mysql架构中实现这样的要求.

在Play中执行此操作的最佳方法是什么!/ JPA?

mar*_*ira 37

有一个代码片段,您可以调整,以实现您的需求.看一看:

// Timestampable.java

package models;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Version;

import play.db.ebean.Model;

@MappedSuperclass
public class Timestampable extends Model {

  @Id
  @GeneratedValue
  public Long id;

  @Column(name = "created_at")
  public Date createdAt;

  @Column(name = "updated_at")
  public Date updatedAt;

  @Version
  public int version;

  @Override
  public void save() {
    createdAt();
    super.save();
  }

  @Override
  public void update() {
    updatedAt();
    super.update();
  }

  @PrePersist
  void createdAt() {
    this.createdAt = this.updatedAt = new Date();
  }

  @PreUpdate
  void updatedAt() {
    this.updatedAt = new Date();
  }
}
Run Code Online (Sandbox Code Playgroud)


Pio*_*cki 21

我认为你可以通过至少两种方式实现它.

数据库默认值

我认为,最简单的方法是,以纪念列updateable=false, insertable=false(这会给你永恒- JPA的将不包括此列进INSERTUPDATE报表),并设置数据库列有现在的默认值.

JPA生命周期回调方法

其他方法是提供@PrePersist生命周期回调方法,将日期对象设置为实际日期new Date().然后你需要确保没有人会编辑这个值,所以你不应该为这个属性提供任何setter.

如果您希望在修改实体时更新日期,您可以类似地实现@PreUpdate生命周期回调方法,该方法将设置实际修改日期.

请记住,如果您正在使用Date对象,则应该对Date对象执行防御性复制(因此您应该返回类似new Date(oldDate.getTime());而不是plain的东西return oldDate).
这将阻止用户使用Date的getter并修改其状态.


小智 6

我觉得有点清楚

    @Column(name = "created_at")
    @CreationTimestamp
    private LocalDateTime createdAt;

    @Column(name = "updated_at")
    @UpdateTimestamp
    private LocalDateTime updatedAt;
Run Code Online (Sandbox Code Playgroud)