2012-11-04 1 views
1

부모 테이블 부모 테이블과 하위 테이블 하위 테이블이 있습니다. 이 관계는 다음과 같습니다.하위 엔티티가 유효하지 않은 데이터를 포함 할 때 Grails는 일대일 관계를 처리 할 수 ​​없습니다.

class Parent { 
    ... 
    Child child 

    static mapping = { 
     child lazy: false, cascade: 'all' 
    } 
    static constraints = { ... } 
} 

class Child { 
    String name 

    static constraints = { 
     name unique: true 
    } 
} 

기존 부모에게 자식을 추가하는 코드를 만들었습니다. 다음과 같이 보입니다 :

def parent = Parent.get(id) 
parent.child = new Child(name: (name)) 
parent.save() 

이 코드는 트랜잭션 서비스 방법에 포함되어 있습니다.

어린이가 유효하지 않은 경우 작동하지 않습니다. 유효성 검사는 수행되지 않습니다. 나는 유명한 최대 절전 모드 오류 :

그것은 쉽게 설명 할 수

object references an unsaved transient instance - save the transient instance before flushing`.

: 아이가 GORM은 객체를 저장할 때, 그 다음이 오류로 인해 중단해야, 아이를 저장하려고하지만 진행 시도, 검증되지 않습니다 저장되지 않은 자식 필드가있는 부모를 저장합니다.

자녀가 유효하지 않은 경우 어떻게해야합니까? 오류에 대한 정보를보기 양식에 전파해야합니다.

나는 이미 수동으로 어린이의 검증을 시도했습니다. 오류 필드에는 1 개의 오류가 있지만 부모는 여전히 유효합니다. 부모 오류 필드에 오류를 삽입하려고했습니다. 부모는 유효하지 않지만 GORM은 여전히 ​​오류를 저장하려고합니다.

답변

1

자녀와 부모 간의 관계에 belongsTo (예 : static belongsTo = [부모])이 정의되어 있습니까? 그렇게하지 않으면, Grails는 Child를 "소유"하지 않기 때문에 부모로부터 Child로 저장/업데이트를 캐스케이드하지 않습니다. 따라서 Child에서 저장이 일어나지 않으면 유효성 검사는 결코 호출되지 않습니다. 그래서 자식 클래스에

static belongsTo = [Parent] 

를 추가하고 당신은 여전히 ​​발생하는 아동 유효성 검사가 표시되지 않는 경우도 deepValidate:true과 가능성을 다시 저장해보십시오. 때문에 귀하의 게시물에 내가 같은 문제에 직면 한이 좋은 답변을

+0

가 아니, belongsTo를이없는 문제를 해결하십시오. 문제는 부모가 자식을 소유하지 않는다는 것입니다 (그것은 단지 예일뿐입니다, 더 복잡합니다). 하지만 여기서 deepValidation을 수행하는 데 기술적 인 문제는 실제로 발생하지 않습니다. 나는 grails JIRA에서도 비슷한 문제를 발견했으나 아직 해결되지 않았습니다. (그래서'bug' 태그를 추가했습니다.) – Roman

+0

저는 아직 Grails에 처음 익숙해졌습니다. 그러나 제 이해에서 보면, 당신이 겪고있는 행동이 옳은 것처럼 보입니다. GORM은 기본적으로 최대 절전 모드의 래퍼이며 최대 절전 모드에서는 관계를 저장할 때 부모에서 하위로 연쇄 효과를 명시 적으로 정의하지 않은 경우 "개체가 저장되지 않은 일시적을 참조합니다."라는 오류가 발생합니다. 계단식 효과를 정의한다면, Hibernate는 새로운 Child 인스턴스를 영속적으로 처리 할 것이다. 그러나 사용자 인스턴스를 저장하기 전에 Child 인스턴스가 유효한 상태인지를 확인하는 것은 여전히 ​​사용자 (또는 어떤 프레임 워크)에게 달려있다. – user553180

+0

In Grails의 경우, GORM은 저장에 대한 유효성 검사를 처리하지만 단 1 대 1 관계에서 부모와 자녀 간의 관계 및 소유권에 관해서 만 말하면됩니다. 관계에서 소유권을 정의 할 수 없다면 부모 인스턴스에 할당하기 전에 Child 인스턴스를 수동으로 저장해야한다고 생각합니다. 어쩌면 더 많은 경험을 가진 사람이 내 이해를 검증/무효화 할 수 있습니다 :-) – user553180

-1

덕분에 내가

def val = (params.company).toInteger() 
def parent = Company.get(val) 
     .addToJobs(new Job(
      experience:params.months, 
      jobdescription:params.desc, 
      joblocation:params.companyloc, 
      jobskills:params.skills, 
      jobtype:params.emp, 
      salary:params.jobsalary, 
      jobtitle:params.jobtitle)) 
     .save() 
관련 문제