エンティティオブジェクトにDate/DateTime/Timestampフィールドを追加します。これは、エンティティが作成/永続化され、「今」に設定されたときに自動的に作成され、再度更新されることはありません。
その他のユースケースには、エンティティの最終変更日を含むように常に更新されるフィールドが含まれていました。
私はそのような要件を達成するために使用しました mysqlスキーマ内 。
Playでこれを行うための最良の方法は何ですか?/JPA?
あなたが望むものを達成するために適応できるコードスニペットがあります。見てください:
// 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();
}
}
少なくとも2つの方法でそれを達成できると思います。
データベースのデフォルト値
私は列を_updateable=false, insertable=false
_としてマークする最も簡単な方法だと思います(これにより不変性が得られます-JPAはこの列をINSERT
およびUPDATE
ステートメントに含めません)。デフォルト値をNOWにするデータベース列。
JPAライフサイクルコールバックメソッド
他の方法は、日付オブジェクトを実際の日付new Date()
に設定する_@PrePersist
_ライフサイクルコールバックメソッドを提供することです。次に、この値を誰も編集しないようにする必要があるため、このプロパティのセッターを提供しないでください。
エンティティが変更されたときに日付を更新する場合は、同様に、実際の変更日を設定する_@PreUpdate
_ライフサイクルコールバックメソッドを実装できます。
Dateオブジェクトを使用している場合は、Dateオブジェクトのdefensive copyを実行する必要があることを覚えておいてください(したがって、単純な_return oldDate
_ではなくnew Date(oldDate.getTime());
のようなものを返す必要があります)。
これにより、ユーザーが日付のゲッターを使用したり、状態を変更したりできなくなります。
少しはっきりしていると思います
@Column(name = "created_at")
@CreationTimestamp
private LocalDateTime createdAt;
@Column(name = "updated_at")
@UpdateTimestamp
private LocalDateTime updatedAt;