LoginSignup
0
0

More than 1 year has passed since last update.

【Hibernate】POST時に作成日時カラムにNULLが入る

Last updated at Posted at 2021-09-02

Spring bootを使用して、簡易的な掲示板アプリを作成していた時に起きたエラーで、なんとなく気になり原因を聞いてみたりしたので、記録として残しておく。

 起こった現象

掲示板に書き込みできる機能を実装後、動作確認してみたら、create_at(作成日時カラム)にNULLが入ろうとしてます。入れようとしてもNOT NULLなのでダメですよ。というエラーが発生しました。

【該当テーブルのカラム】
id(AUTO_INCREMENT)
content(投稿内容)
created_at(作成日時)

【エラー文】
"create_at"カラムのnull値が非null制約に違反しています。

確かにテーブルでNOT NULL制約を設けているが、デフォルトでCURRENT_TIMESTAMPが入るようにしており、理由がわからないので調べてみました。

原因

結論、entityにフィールドを定義しているかしていないかが関係していた。

entity
    @Column
    private Timestamp created_at;

上記のようにフィールドを定義している状態で投稿するととエラーが発生し、定義していない状態で投稿するとエラーは発生しなかった。

フレームワークの機能で、フィールドを定義していると何か値を入れないといけないとフレームワークが勘違いしているのだという。

created_atに値を入れる処理は当然のごとく書いていないので、とりあえずNULLを入れとけみたいな感じで、NULLを入れようとしてた→NOTNULL制約があるのではじかれてエラー発生の流れ。

逆にフィールドを定義していない状態で値を入れようとしないので、デフォルトの値が入るようになるとのこと。

おまけ

フィールドを定義している状態で現在時間を入れたい場合は@CreationTimestampを付与すればよい。

entity

@CreationTimestamp
@Column
private Timestamp created_at;

@CreationTimestampはドキュメントには以下のように書いてある(英語訳)

プロパティを、それを含むエンティティの作成タイムスタンプとしてマークします。プロパティ値は、所有エンティティを初めて保存するときに、現在のVM日付に1回だけ設定されます。

簡単に言うと、レコード登録時、このアノテーションを付与したカラムには現在時刻が入りますよ。と書いてある気がする。

このアノテーションを付与すればエラーは発生せず、投稿ができました。

以上です。

間違ってたら、ご指摘いただければ幸いです。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0