2012-03-04 15 views
1

私はこの強力なツールを学ぶためにgrailsを使って個人的なプロジェクトを開発しています。 自分のドメインクラスに「ポスト」の2つの新しいフィールド(x、y)を追加するとき、私は、この問題が発生していますGrailsはnullの代わりにnullを使用してテーブルを変更します

class Post { 

    long id; 
    Date creationDate; 
    String text; 
    byte[] image; 
    Style style; 

    long likeCount; 
    long dislikeCount; 

    User owner; 

    //coordinates on the wall 
    int x; 
    int y; 

    //this is probably to remove 
    static hasMany = [judgment : Judgment]; 

    static constraints = { 
     text(nullable:true, maxSize:5000); 
     image(nullable:true, maxSize:1000000); 
     creationDate(nullable:true); 
     x(nullable:true); 
     y(nullable:true); 
    } 
} 

私はPostgresデータベースの一部のデータ(ポストレコード)を作成した後、私はxとyを追加しました。 しかし、私は実行アプリ際のGrailsでは、このエラーをコンソールが起動します:私は、x、yがNULL可能であることを制約の中で宣言するので

| Error 2012-03-04 12:04:23,670 [pool-5-thread-1] ERROR hbm2ddl.SchemaUpdate - Unsuccessful: alter table post add column x int4 not null 
| Error 2012-03-04 12:04:23,672 [pool-5-thread-1] ERROR hbm2ddl.SchemaUpdate - ERROR: column "x" contains null values 

これは非常に奇妙な..ですので、Grailsのが私のテーブル宣言のxを変更しようとする理由とyがnullでないようにするには?

答えて

4

これらはプリミティブなフィールドなので、nullableは意味がありません。クラスインスタンスにnull値を格納することはできません。データベースにNULL値がある場合は、intの値に変換することはできません。 0には妥当な値があると見なすことができますが、0とnullは一般的に等価ではありません。

あなたは原始的数字(intlongなど)またはbooleanにnull値が非プリミティブオブジェクトクラスIntegerLongBooleanなどを使用できるようにしたい場合は、プリミティブ型のもう一つの問題は、検証です。デフォルトでは0(またはbooleanの場合はfalse)なので、ユーザが0またはfalseを選択したかどうか、または選択肢がまったくなく、コンストラクタのデフォルト値があるかどうかはわかりません。だから、それらを非プリミティブにすると、それらはnullとなり、あなたは彼らが選択をしたかどうかを知ることができます。

また、無関係 - idフィールドを宣言する必要はありません。なぜなら、Grailsはこれをあなたのために追加するからです。そしてセミコロンを失う;)

+0

あなたはとても感謝しています。常にプリミティブでない値を使う方が良いと思いますか?データベーススキーマを変更して新しいフィールドを追加する必要があると仮定します。非プリミティブ型を使用すると、既存のレコードのデフォルト値がnullになるため、この問題を回避する必要があります。 – Giuseppe

関連する問題