2012-03-04 2 views
1

이 강력한 도구를 배우기 위해 grails로 개인 프로젝트를 개발하고 있습니다. 내 포스트 그레스 데이터베이스에서 일부 데이터 (후 기록)을 만든 후Grails는 널 대신 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); 
    } 
} 

내가 x와 y를 추가 : 내 도메인 클래스 "포스트"에 두 개의 새로운 필드 (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

그들은 원시적 인 int 필드이므로 nullable은 의미가 없습니다. 클래스 인스턴스에 널값을 저장할 수 없으며 데이터베이스에 널 값이있는 경우 int 값으로의 적절한 기본 변환이 없습니다. 0에 대해 합리적인 값을 고려할 수 있지만 0과 null은 일반적으로 동일하지 않습니다.

당신은 원시 번호 등 (int, long 등) 또는 boolean가 아닌 원시 개체 클래스 Integer, Long, Boolean을 사용하기 위해, 원시적 형태의 또 다른 문제는 검증이다에 대한 null 값을 허용 할 경우

. 기본값이 0 (또는 boolean의 경우 false)이므로 사용자가 0 또는 false을 선택했는지 또는 선택하지 않았고 생성자의 기본값 만 갖고 있는지 알 수 없습니다. 따라서 비 프리미티브로 만들면 null이되며 선택 여부를 알 수 있습니다.

또한 관련이 없습니다. id 필드를 선언 할 필요가 없습니다. Grails가 대신 하나를 추가하기 때문에. 그리고 세미콜론을 잃어라;)

+0

당신은 매우 감사합니다, 대단히 감사합니다! 항상 원시가 아닌 값을 사용하는 것이 더 좋다고 생각하십니까? 데이터베이스 스키마를 변경하고 새 필드를 추가해야한다고 가정합니다. 기본이 아닌 유형을 사용하면 기존 레코드의 기본값이 null이므로이 문제를 방지해야합니다. – Giuseppe

관련 문제