hibernateのHBM2DDLに伝えて、 @Enumerated Annotatedフィールドのmysql enum列を追加するように

StackOverflow https://stackoverflow.com/questions/5835501

質問

以下と同様に、Javaコードを使用してHBM2DDLを使用してDBテーブルを作成しています。

@Entity
public  class Filter {
    public enum Type {
        TypeA, TypeB;
    }
    @Enumerated(EnumType.STRING)
    private Type type;
}

正常に動作しますが、「タイプ」の場合、Varchar列が作成されます。つまり、DDLコードは次のようになります。

CREATE TABLE IF NOT EXISTS `filter` (`type` varchar(255) DEFAULT NULL)

しかし、私が持ちたいのはこれです:

CREATE TABLE IF NOT EXISTS `filter` (`type` enum('TypeA','TypeB') NOT NULL)

これは、注釈で希望する冬眠で宣言することが可能ですか?

または、SchemaUpdateを拡張し、列挙されたフィールドの変更されたスクリプト部分を私が好きなようにレンダリングする方法を上書きする方法はありますか?

背景:同じデータベースがプロジェクトのPHP部分で使用されており、無効な値が挿入されるのを防ぎたいと思います。

役に立ちましたか?

解決

Java.sql.Typesは、Javaで処理されたSQLタイプを定義するJava.sql.Typesには列挙タイプがないため、複雑になると思います(SQL-92によると標準化されたタイプではないため)。

もしそうなら だった Hibernate Custom Usertypeを作成してEnumtypeを拡張し、それに応じてSQLTypeを設定できますが、Java.sql.Typesが処理しないため、ネイティブSQL列挙の使用方法がわかりません。

よろしくお願いします!

他のヒント

Lucasが彼の答えで指摘したように、MySQL enumsを100%自動的に処理する方法はないようですが、実際には簡単な方法があります。使用できます columnDefinition 属性 @Column アノテーション。これは、カスタムDDLコードを生成するために特別に設計されているようです。

属性を説明するドキュメントの抜粋を参照してください。

(オプション)列のDDLを生成するときに使用されるSQLフラグメント。

デフォルトで生成されたSQLを使用して、推測された型の列を作成します。

NOT NULL 制限は非常に標準であり、別の属性によってサポートされています nullable.

したがって、あなたのプロパティの定義は次のようになります:

@Enumerated(EnumType.STRING)
@Column(columnDefinition = "enum ('TypeA', 'TypeB')", nullable = false)
private Type type;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top