[Hibernate] アノテーションで DEFAULT CURRENT_TIMESTAMP を設定
Hibernate の @Column
アノテーションを使って、 MySQL の timestamp
型カラムに DEFAULT CURRENT_TIMESTAMP
と ON UPDATE CURRENT_TIMESTAMP
を設定する方法。
@Column(nullable = false, updatable = false, insertable = false,
columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
private ZonedDateTime created;
@Column(nullable = false, updatable = false, insertable = false,
columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private ZonedDateTime updated;
columnDefinition
で、 DEFAULT CURRENT_TIMESTAMP
句や ON UPDATE CURRENT_TIMESTAMP
句を指定することができる。
updatable = false
と insertable = false
を指定しないと NotNull
制約に引っかかりエラーが出る。
理由は、 MySQL 上では NotNull
だけど、 JPA が insert
や update
するときには、対象エンティティのフィールドは Null
となっているため。
insertable
: このフィールドを SQL INSERT ステートメントに含めるか
updatable
: このフィールドを SQL UPDATE ステートメントに含めるか
JPA で日時データを DB 登録すると、 Java が動いている環境のタイムスタンプに勝手に変換される。そのため、 Java の実行環境が JST
、 MySQL が UTC
など、タイムゾーンが異なる場合、 JPA での日時操作は、意図した値と異なる場合がある。