私が作成したUserPreferences
豆を。主キーid
列。ここでは、Beanの定義は次のとおりです。
@Entity
public class UserPreferences {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(unique = true)
@ColumnDefault("")
private String id;
private String email;
// Getters and Setters
}
今、私が使用Kotlin
このBeanにデータを挿入します。ここではそうするためのコードは次のとおりです。
val newUserPreferences = UserPreferences().apply { email = newUserRequest.email }
mUserPreferenceService.save(newUserPreferences)
仮定しましょうnewUserRequest.email
ではありませんnull
。auto-dll
私の設定application.yml
IS update
。このコードが実行されると、私はそれが参照Hibernate
テーブルを作成するためのクエリを次生成します。
create table user_preferences (
id varchar(255) default not null
email varchar(255),
primary key (id)
) engine=MyISAM
この時点で、アプリケーションは次のエラーでのロードに失敗します。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:によって引き起こされるあなたのSQL構文でエラーが発生しています。、右の構文についてはMariaDBサーバのバージョンに対応が近い「NOT NULLを使用すること取扱説明書をご確認ください
なぜなら代わりに空を使用しての例外を見てみると、それはコードが失敗していることを非常に明確であるString
デフォルト値として、Hibernateは単純に生成されたクエリに空白を入れています。だからここに私の質問は以下のとおりです。
- これは、休止状態のバグとして扱われるべきか?
- 私は、空の文字列を持っていると思います。このような状況の処理方法
""
列のデフォルト値としての?
私は、Hibernateのユーザーではないんだけど、私が見つかりました。https://github.com/hibernate/hibernate-orm/blob/master/documentation/src/test/java/org/hibernate/userguide/schema/ColumnDefaultTest.javaショーを:
@ColumnDefault("'N/A'")
あなたがSQLの文字列型のデフォルト値を定義するとき、あなたはJavaの文字列内のSQL文字列の区切り文字(単一引用符)を使用しなければならないことが表示されます。あなたは空の文字列をしたいので、あなたのケースでは、あなたが使用したいです:
@ColumnDefault("''")
デフォルトを定義する他の方法は、属性を設定することで@Column
、別のスタックオーバーフローの答えに示すように、注釈:休止状態にデフォルト値を設定する方法
これはバグではないかもしれないが、それは一部のユーザーに直感に反している休止状態の使い方だと、おそらく明確に文書化されていません。
PS:私は、HibernateはまだとTABLE文CREATE生成するバグとしてそれを数えるだろうengine=MyISAM
あなたは右hibernate.dialectを指定しない限りは。そのストレージエンジンは推奨されません。MyISAMテーブルは、ほとんどの場合、InnoDBはより遅く、および任意のACID特性をサポートするために失敗しました。MySQLはMyISAMテーブルを段階的に廃止された、と私は、現在のプロジェクトのためにそれを使用することはお勧めしません。