HibernateのクエリがSQL構文エラーで終わります

Prashant:

私が作成した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ではありませんnullauto-dll私の設定application.ymlIS 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は単純に生成されたクエリに空白を入れています。だからここに私の質問は以下のとおりです。

  1. これは、休止状態のバグとして扱われるべきか?
  2. 私は、空の文字列を持っていると思います。このような状況の処理方法""列のデフォルト値としての?
ビルKarwin:

私は、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テーブルを段階的に廃止された、と私は、現在のプロジェクトのためにそれを使用することはお勧めしません。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=213507&siteId=1