2014-02-11 3 views
8

도메인 클래스에 사용자 지정 ID 특성이 매핑되어있는 경우 최대 절전 모드에서 고유 제한 조건을 검사하는 이유는 무엇입니까? 개체를 업데이트 할 때 게시 된 필드 값이 DB에 저장된 것과 동일하더라도 유효성 검사가 실패합니다! 이는 양식에 아무런 변경을 가하지 않더라도 (더티 : false 및 속성 바인딩 오류 없음) 발생합니다. 이제Grails에서 업데이트시 고유하게 제약 된 필드가 실패하는 이유

class User { 
    Long profileId 
    String email 
    String username 
    String password 
    String title 
    String firstname 
    String lastname 
    String zipCode 
    Date lastLoginDate 

    static constraints = { 
     profileId nullable: true, blank: true 
     email blank: false, unique: true, email: true 
     username blank: false, unique: true 
     password blank: false 
     lastLoginDate nullable: true 

     firstname nullable: true 
     lastname nullable: true 
     zipCode nullable: true 
    } 

    static mapping = { 
    table 'USER_PROFILE' 
    id name:"profileId", column: "profile_id", generator: "sequence", params: [sequence:'userprofile_sequence'] 
    version false 
    } 

} 

, 내가 최소한의 속성 세트와 사용자를 만들 때, 레코드가 생성됩니다 은 내가 Grails의 도메인 클래스 아래와 같이 있습니다. 그러나 같은 개체를 업데이트하려고하면 : def user = user.findByUsername ('akeel') user.lastLoginDate = new Date() user.save (flush : true) 고유 한 유효성 검사가 실패하기 때문에 아무 일도 일어나지 않습니다. . user.save (validate : false, flush : true)유효성 검사를 무시할 수 있습니다. 사용자가 추가 할 때마다 zipCode의 유효성을 검사해야하므로이 옵션이 아닙니다.

제안 된 here 제안 된 '반복되는 열의 매핑'문제를 해결하기 위해 맞춤 ID 열에 대한 제약 조건 인 profileId를 nullable로 설정해야했습니다.

이 질문은 정확히 here과 비슷한 내용이지만 제안 된 해결책은 저에게 효과적이지 않습니다.

Grails 2.1.2를 사용 중입니다. 문제를 이해하는 데 필요한 것이 있으면 알려 주시기 바랍니다.

답변

4

Grails에서 기본 키의 사용자 정의 속성 이름이 작동하지 않는 것 같습니다. 나는 Grails 2.0.4, 2.2.4, 2.3.4로 테스트를했으며, 모두 profileId을 기본 키로 인식하지 못했습니다. User.get(1)은 정상적으로 작동하지만 user.ident()null을 반환합니다. 확실히 Grails JIRA에서 문제를 제기 할 것입니다.

가장 간단한 해결책은 profileId 속성을 제거하고 대신 내장 된 id을 사용하는 것입니다. 그런 다음 사용자 정의 매핑에서 name: 값을 제거하기 만하면됩니다. 즉, 결국

으로 끝나야합니다.
id column: "profile_id", generator: "sequence", params: [sequence:'userprofile_sequence'] 
+0

감사합니다. 제안 된 솔루션으로 변경하면 완벽하게 작동합니다. –

+0

[문제 제기] (http://jira.grails.org/browse/GRAILS-11118). –

+0

해결 방법으로 사용자 객체를 업데이트 할 때'user.properties.id = 0L'을 (원래 게시물에 링크 된대로) 설정할 수 있습니다. GORM은 객체/고유 속성의 유효성을 검사하고 올바르게 다시 저장합니다. – tmarthal

관련 문제