[Hibernate] アノテーションで DEFAULT CURRENT_TIMESTAMP を設定

JavaJPA,SpringBoot

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 = falseinsertable = false を指定しないと NotNull 制約に引っかかりエラーが出る。
理由は、 MySQL 上では NotNull だけど、 JPA が insert update するときには、対象エンティティのフィールドは Null となっているため。

insertable : このフィールドを SQL INSERT ステートメントに含めるか

updatable : このフィールドを SQL UPDATE ステートメントに含めるか

JPA で日時データを DB 登録すると、 Java が動いている環境のタイムスタンプに勝手に変換される。そのため、 Java の実行環境が JST 、 MySQL が UTC など、タイムゾーンが異なる場合、 JPA での日時操作は、意図した値と異なる場合がある。

Posted by Agopeanuts