[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 での日時操作は、意図した値と異なる場合がある。