Spring bootを使用して、簡易的な掲示板アプリを作成していた時に起きたエラーで、なんとなく気になり原因を聞いてみたりしたので、記録として残しておく。
起こった現象
掲示板に書き込みできる機能を実装後、動作確認してみたら、create_at(作成日時カラム)にNULLが入ろうとしてます。入れようとしてもNOT NULLなのでダメですよ。というエラーが発生しました。
【該当テーブルのカラム】
id(AUTO_INCREMENT)
content(投稿内容)
created_at(作成日時)
【エラー文】
"create_at"カラムのnull値が非null制約に違反しています。
確かにテーブルでNOT NULL制約を設けているが、デフォルトでCURRENT_TIMESTAMPが入るようにしており、理由がわからないので調べてみました。
原因
結論、entityにフィールドを定義しているかしていないかが関係していた。
@Column
private Timestamp created_at;
上記のようにフィールドを定義している状態で投稿するととエラーが発生し、定義していない状態で投稿するとエラーは発生しなかった。
フレームワークの機能で、フィールドを定義していると何か値を入れないといけないとフレームワークが勘違いしているのだという。
created_atに値を入れる処理は当然のごとく書いていないので、とりあえずNULLを入れとけみたいな感じで、NULLを入れようとしてた→NOTNULL制約があるのではじかれてエラー発生の流れ。
逆にフィールドを定義していない状態で値を入れようとしないので、デフォルトの値が入るようになるとのこと。
おまけ
フィールドを定義している状態で現在時間を入れたい場合は@CreationTimestampを付与すればよい。
@CreationTimestamp
@Column
private Timestamp created_at;
@CreationTimestampはドキュメントには以下のように書いてある(英語訳)
プロパティを、それを含むエンティティの作成タイムスタンプとしてマークします。プロパティ値は、所有エンティティを初めて保存するときに、現在のVM日付に1回だけ設定されます。
簡単に言うと、レコード登録時、このアノテーションを付与したカラムには現在時刻が入りますよ。と書いてある気がする。
このアノテーションを付与すればエラーは発生せず、投稿ができました。
以上です。
間違ってたら、ご指摘いただければ幸いです。