wrongwrongな開発日記

しんまいさんの忘備録

【JDBC】SimpleJdbcInsertでDEFAULTを設定したEnumのInsert時にcannot be nullと言われる状況への対処

wrongwrong163377.hatenablog.com
前回の記事がトラブっていた原因が判明したので書き直します。

原因

NOT NULLEnumカラムに対して値を指定しない場合、com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column '[カラム名]' cannot be nullになります。

詳細

テーブルの内指定していないカラムに関する値は全てNULLで埋められてしまうため、「NULLをInsertしようとする→NULLは設定できないのでエラー」となります。

前回の記事で書いた↑の内容は正しいです。
ただし、Enum以外(自分が見つけられなかったので他有るかは不明です)の場合勝手にデフォルトを使ってリトライするようで、問題は起きません。

対処

DEFAULTを使いたいカラム名usingGeneratedKeyColumnsに設定すればOKです。

SimpleJdbcInsert jdbcInsert =
    new SimpleJdbcInsert(jdbcTemplate)
            .withTableName("[テーブル名]")
            .usingGeneratedKeyColumns("[DEFAULTを使うカラム名]");

前回のやり方をしてしまうとBeanPropertySqlParameterSourceを使えないので、こちらのやり方が演繹的です。