全体概要
Spring Data JPA、Hibernateを使用したJavaアプリケーションで開発を行っています。
あるEntityはvalue objectとしてenum型フィールドを持っています。
エラー概要
@Enumerated(EnumType.STRING)
なフィールドを持つEntityがありました。このアノテーションは、enumクラスをフィールドとするEntityを作成する際に使うアノテーションです。
いまフィールドに対し、新しいenum定数を定義したところ、INSERT実行時に以下のようなエラーを踏み、少しハマってしまいました。
Check constraint violation: "CONSTRAINT_30: "; SQL statement:
(SQL省略) [23513-220]
could not execute statement [制約違反を確認してください: "CONSTRAINT_30: "
Check constraint violation: "CONSTRAINT_30: "; SQL statement:
省略
org.springframework.dao.DataIntegrityViolationException: could not execute statement [制約違反を確認してください: "CONSTRAINT_30: "
Check constraint violation: "CONSTRAINT_30: "; SQL statement:
(SQL省略) [23513-220]] [(SQL省略))]; SQL [(SQL省略)]; constraint ["CONSTRAINT_30: "; SQL statement:
(SQL省略)[23513-220]]
at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:269)
at app//org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:229)
既存enumでは問題なく、追加したenumでのみ発生しました。
またColumn
アノテーションでlengthを伸ばしても発生し、一意制約違反となるSQLは発行していませんでした。
解決
私の場合、application.propertiesのspring.jpa.hibernate.ddl-auto
の設定ミスでした。
どうやらHibernateの上記設定値がupdate
の場合、スキーマが更新されず、新規追加したenumの値がenum型カラムとして許容されない値が入ったと怒られるようです。
パラメータの設定値をcreate
に変更し、ビルドしなおすことで解消しました。