Spring boot,JPA,MySQLを使用して、DB接続した際にカラムに関するエラーが発生してハマってしまったので忘備録として残しておく。
タスク管理アプリ作成しており、タスクテーブルに対応するentityであるTaskクラスを作成してアプリを起動した時に以下のエラーが発生した。
【発生したエラー】
Unknown column 'created_date' in 'field list'
フィールドに'create_date'という不明なものがあると言っているのはわかるが、以下の通り、entityでは'createdDate'と書いているし、MySQLでも同様の名前で命名している。
@Entity
public class Task {
@Id
@GeneratedValue
private int id;
@Column
private int user_id;
@Column
private String title;
@Column
private String task;
@Column(updatable = false)
@CreationTimestamp
private Timestamp createdDate;
@Column
@UpdateTimestamp
private Timestamp updatedDate;
}
テーブルの構造↓(面倒なので画像で)
'created_date'というフィールドはないのにエラーでは存在していると言われて原因と解決方法がわからずハマってしまった。
原因と対応策
JPA(Hibernate)の仕様によるものでキャメルケースで命名されたフィールドはスネークケースに変換されるようだ。
調べたところ、Hibernateでは以下の順に変換を行ってからカラム名が作成される。(デフォルト)
①論理名の生成
クラス名、フィールド名を論理名として取得し、@Columnや@Tableで指定されていれば、その文字列を論理名にする
②物理名の生成
ピリオドをアンダーバーに置き換える
キャメルケースをスネークケースに置き換える
今回の場合、タスクテーブルのカラム'createdDate'に対応するTaskクラスのフィールド名をそのまま'createdDate'としていたが、'created_date'に変換されてしまったため、カラム名に対応していなくてエラーが発生した。
対応策として、タスクテーブルのカラム名を'created_date'に変更したことで解決できたが、entity側を修正する場合は@Column(name="createddate")のように全て小文字にすれば問題なく取得できるとのこと。