web-dev-qa-db-ja.com

Playで自動生成された日付/タイムスタンプフィールドを作成する方法! / JPA?

エンティティオブジェクトにDate/DateTime/Timestampフィールドを追加します。これは、エンティティが作成/永続化され、「今」に設定されたときに自動的に作成され、再度更新されることはありません。

その他のユースケースには、エンティティの最終変更日を含むように常に更新されるフィールドが含まれていました。

私はそのような要件を達成するために使用しました mysqlスキーマ内

Playでこれを行うための最良の方法は何ですか?/JPA?

15
ripper234

あなたが望むものを達成するために適応できるコードスニペットがあります。見てください:

// 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();
  }
}
37
marcospereira

少なくとも2つの方法でそれを達成できると思います。

データベースのデフォルト値

私は列を_updateable=false, insertable=false_としてマークする最も簡単な方法だと思います(これにより不変性が得られます-JPAはこの列をINSERTおよびUPDATEステートメントに含めません)。デフォルト値をNOWにするデータベース列。

JPAライフサイクルコールバックメソッド

他の方法は、日付オブジェクトを実際の日付new Date()に設定する_@PrePersist_ライフサイクルコールバックメソッドを提供することです。次に、この値を誰も編集しないようにする必要があるため、このプロパティのセッターを提供しないでください。

エンティティが変更されたときに日付を更新する場合は、同様に、実際の変更日を設定する_@PreUpdate_ライフサイクルコールバックメソッドを実装できます。

Dateオブジェクトを使用している場合は、Dateオブジェクトのdefensive copyを実行する必要があることを覚えておいてください(したがって、単純な_return oldDate_ではなくnew Date(oldDate.getTime());のようなものを返す必要があります)。
これにより、ユーザーが日付のゲッターを使用したり、状態を変更したりできなくなります。

21
Piotr Nowicki

少しはっきりしていると思います

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

    @Column(name = "updated_at")
    @UpdateTimestamp
    private LocalDateTime updatedAt;
0
lirugo