2016-09-21 5 views
1

Hibernateで列を追加しています。もちろん、hibernate.hbm2ddl.autoプロパティは "update"に設定されています。変更されていないクラスは、次のようになります。Hiberateは、プリミティブ型フィールドの列をNonNullableとして追加します。

@Entity 
public class Foo { 
    @Id 
    @GeneratedValue 
    private int id; 

    public Foo() { 

    } 
} 

変更クラスは次のようになります。

私は、エラー、次の取得上記のように、私は、プリミティブ型の列を追加してい
@Entity 
public class Foo { 
    @Id 
    @GeneratedValue 
    private int id; 

    private int newValue = 0; 

    public Foo() { 

    } 
} 

Caused by: ERROR 42601: In an ALTER TABLE statement, the column 'NEWVALUE' has been specified as NOT NULL and either the DEFAULT clause was not specified or was specified as DEFAULT NULL. 

@Column API "には、列注釈が指定されていない場合、デフォルト値が適用されるため、理由は疑問です。"とデフォルト値のfo rヌル可能属性は "true"です。

奇妙です - 私は文字列または他のオブジェクトのエラーを取得しません。古い行には単に "null"が置かれます。また、nullableをtrueに排他的に設定すると、プリミティブ型のエラーは発生しません。

private String newValue = "0"; //Gives no error 

private String newValue; //Gives no error 

@Column (nullable = true) 
private int newValue; // Gives no error 

結論として、hibernateはプリミティブの列をデフォルトではnullでないものとして設定します。列を追加すると、エラーをスローする新しい列の値を持たないレガシー行がいくつかあります。

毎回@Column(nullable = true)を排他的に設定せずにこの動作をグローバルに変更できるかどうかは疑問です。

答えて

0

の代わりにIntegerというnewValueを宣言したほうがいいでしょうか?これがデフォルトでnullable=trueようになります:プリミティブ型の

@Entity 
public class Foo { 
    @Id 
    @GeneratedValue 
    private int id; 

    private Integer newValue; 

    public Foo() { 

    } 
} 

nullable=trueが本当に意味がない、null値を持つことができないよう。あなたは書くことができません:int a = null;

関連する問題