2014-01-05 4 views
2

DB에서 고유 한 제한을 정의하려고합니다. 의 간단한 도메인 클래스를Grails - 예외가 발생했을 때 고유 한 제약 조건 설정

class Tag { 

    String name 

    static mapping = { 
     sort name: "asc" 
    } 

    static constraints = { 
     name(blank: false, nullable: false, unique: true) 
    } 
} 

보자 다음 컨트롤러

def test() { 

     def tag = new Tag(name: 'test'); 
     tag.save(flush:true); 
     print tag.id 

     tag = new Tag(name: 'test'); 
     tag.save(flush:true); 
     print tag.id 

     render "it works" 
    } 

에 출력 내 질문은

1 
null 

입니다, 내가 어떻게 두 번째 작업을 저장 한 후 예외를 얻을 수 있습니다 - 그것은 중요하다 두 번째 태그가 지속되지 않음을 알기 때문에 두 번째 태그에 대한 모든 작업에 의미가 없습니다.

답변

2

failOnError를 사용하여이 동작을 수행 할 수 있습니다.

그러나이 경우 ValidationException은 고유 제한 조건뿐만 아니라 유효성 검증 오류가 발생할 때 발생합니다. 당신은 또한 당신의 관례에 따라 grails-app/conf의 항목 아래에 추가하여 저장()시 발생한 예외를 볼 수

tag = new Tag(name: 'test'); 
    tag.save(flush:true, failOnError: true); 
    print tag.id 
+0

, 감사합니다 당신에게

감사
Motilal을하는 데 도움이 – mrok

1

/Config.groovy 파일

grails.gorm.failOnError=true 

(가) 저장 방법은 영속 컨텍스트를 알리는 그 인스턴스

: 선택적 매개 변수

save(validate:true, flush:true, failOnError:true) 

매개 변수 다음 가질 수있는 저장하거나 업데이트해야 true로 설정 즉시 개체를 지속하고

failOnError 잠금 낙관적에 대한 버전 열을 업데이트 영속 컨텍스트를 플러시 - 16,

유효성 검사 (선택 사양)를 - 검증이

을 생략

플러시 (옵션) 할 필요가있는 경우 false로 설정 (선택 사항) - true로 설정하면 유효성 검사가 실패 할 경우 grails.validation.ValidationException을 던져 save 메소드가 발생합니다. 는 SQL INSERT를 (선택 사항)

deepValidate를 할 최대 절전 모드를 강제 true로 설정하면 - -

삽입 (옵션) 도메인 인스턴스의 협회도, 즉 여부를 검증 폭포를 검증해야하는지 여부를 결정합니다. 계단식 유효성 검사를 사용하지 않으려면 false로 설정하십시오.

이렇게하면 저장 중에 발생한 모든 오류를 확인하십시오.

if (!tag.save()) { 
     tag.errors.each { 
     println it 
    } 
} 

희망이 작동