2012-07-25 5 views
0

나는 hibernate .Under grails 1.3.7 모든 것이 제대로 작동을 사용하여 Grails 애플리케이션을 가지고,하지만 난 grails 2.0.3로 전환 할 때 다음과 같은 문제가 나타납니다Grails의 고유 제한 조건

내가 java/src 디렉토리에 고유 한 필드를 확인할 수 없습니다. 동일한 고유 키가있는 레코드를 추가하거나 업데이트하려고하면 배치 삽입 오류가 나타납니다. src/groovy에서

내가 확인하는 클래스를 생성 검증 :

Example: LanguageCommand.groovy 

package myproject.command 

import org.codehaus.groovy.grails.validation.Validateable; 

@Validateable 
class LanguageCommand { 

    String code 
    String codeDescription 

    static constraints= { 
     code(blank:false, maxSize:50) 
     codeDescription(maxSize:200) 
    } 
} 

src/java에서 나는 독특한 필드

myproject.model가 포함 된 패키지의 이름입니다
Example: LanguageConstraints.groovy 

package myproject.model 

    constraints = { 
     code unique: true 
    } 

를 확인하는 클래스를 생성 최대 절전 클래스.

참고 :Validation class works fine but the unique one not. i try to add unique constraints to validation class, same error appears

오류 :

Error 500: Executing action [save] of controller 
      [myproject.controller.LanguageController] 
      caused exception: Runtime error executing action 
Servlet: grails 
URI: /myproject/grails/language/save.dispatch 
Exception Message: Batch entry 0 insert into language 
        (language_code, code_description, version, id) 
        values (en, English, 0, 1) was aborted. 
        Call getNextException to see the cause. 
Caused by: Batch entry 0 insert into language 
      (language_code, code_description, version, id) 
      values (en, English, 0, 1) was aborted. 
      Call getNextException to see the cause. 
Class: LanguageController 
At Line: [125] 
Code Snippet: 

어떤 도움? 당신이 LanguageCommand.groovy 클래스를 생성합니다 src/groovy에서

+0

왜'src/java'에'.groovy' 클래스를 넣고 있습니까? 고유 한 제약 조건을 테스트하기위한 –

+0

은 http://grails.org/doc/latest/guide/hibernate.html#addingConstraints –

답변

2

는 :

package myproject.command 

import org.codehaus.groovy.grails.validation.Validateable; 

@Validateable 
class LanguageCommand { 
    String oldCode 
    String code 
    String codeDescription 

    static constraints= { 
     code(maxSize:40, blank:false, validator: { val, obj -> 
      if((obj.oldCode != val) && (Language.findWhere(code:val) != null)) 
       return['constraints.unique.code'] 
     }) 
     codeDescription(maxSize:200) 
    } 
} 

및 국제화에

/messages.properties 당신은 (the message you want to display it)를 작성해야합니다 :

constraints.unique.code = code must be unique 

을 체크하기 전에 업데이트 방법에 컨트롤러 유효성 확인은 다음과 같이 작성해야합니다.

def update = { 
    LanguageCommand languageCommand -> 
    Language languageInstance = Language.get(params.id) 
    if(languageInstance) { 
     languageCommand.oldCode = languageInstance.code 
     if (!languageCommand.validate()){ 
      ... 
      ... 
     } 
     ... 
     ... 
    } 
    ... 
    ... 
} 

참고 : oldCode는 작성시에만 업데이트에 사용됩니다. 코드를 변경하지 않고 코드로 언어를 검색하면 결과가 반환되므로 코드가 이전 코드와 같을 때 업데이트하기 전에 코드를 저장합니다. 우리는 코드별로 언어를 검색하지 않았습니다.

희망이

+0

과 일치하지 않습니다. 더 많은 것을 설명하십시오 ... –

+0

지금 내 대답보기 –

+0

이 대답은 내 문제를 해결하지만 내 코드에서 어떤 문제인지 알고 싶습니까? –

0

Grails의 2에서, 고유 제한 조건은 GORM 도메인 (GORM 매핑)에 적용 할 수 있지만, 도메인 (매핑을 최대 절전 모드) 최대 절전 모드로 전환하지이 도움이됩니다. 적절한 검사기가 grails에 추가되었습니다. AbstractPersistentConstraint 클래스의 isValid 메서드를 참조하십시오.

Grails 1.3.x에서는이를 확인하지 않았습니다.

관련 문제