2009-09-03 5 views
7

여기는 Grails 사용자를위한 것입니다. 내가 grails - user 메일 링리스트에서 요청했지만, 며칠 동안 이걸 싸워 왔기 때문에 나는 가능한 한 그물망을 넓혀야한다고 생각했다.Grails - 계단식 삭제가있는 동일한 클래스의 여러 belongsTo

두 객체를 참조하는 다른 객체 (다른 유형)에서 동일한 유형의 두 객체 사이의 관계를 모델링하는 데 어려움이 있습니다.

예를 들어, 은 가족 간의 관계를 모델링한다고 가정합니다. 모든 주어진 관계 "belongsTo"두 다른 가족 구성원. 그래서 여기

class Person { 
    hasMany[relationships: Relationship] 

    static mappedBy = [relationships:'p1', relationships:'p2'] 
} 

class Relationship { 

    Person p1 
    Person p2 
    String natureOfRelationship // for example, "cousins" 

    static belongsTo = [p1: Person, p2: Person] 
} 

목적은 그 P1 또는 P2 중 하나가 삭제되면, hasMany의지도에있는 모든 관계 객체에 다음 삭제합니다 폭포입니다. 대신, 내가 시도 할 때마다 외래 키 위반으로 끝납니다. 내가 운이 없었

static mapping = { 
    relationships cascade:'delete' 
} 

:

http://grails.org/doc/1.0.x/guide/single.html#5.5.2.9%20Custom%20Cascade%20Behaviour

그래서 나는 Person 클래스에이를 추가 할 생각

: 문서에서 다루지로 나는 "폭포"속성을 사용하여 시도 그 중 하나.

또한 Grails가 생성 한 devDB.script 파일을보고 이 관계에 외래 키를 설정하는 방법을 확인했습니다. 수동으로 "ON DELETE CASCADE"를 외래 키 제약 조건에 추가하면 제대로 작동하지만 분명히 자동으로 생성 된 데이터베이스 스크립트 에 대한 수동 편집은 가장 강력한 솔루션이 아닙니다. 이상적으로 나는 GORM을 사용하여 그 동작을 지정할 수 있기를 원합니다.

그럼 내 최선의 제안은 무엇입니까? 여러 개의 외부 키/소유자에 계단식 삭제를 적용 할 수있는 방법이 있습니까? Person에서 onDelete 액션 을 사용하여 수동으로이 작업을 수행해야합니까? 에 대한 최대 절전 모드 설정이 필요합니까, 아니면 Grails/GORM에서 어떤 방식으로 할 수 있습니까?

시간과 도움을 주셔서 대단히 감사드립니다.

+0

dave, 어떻게이 문제를 해결 했습니까? 내가 생각하는 코드 : 정적 mappedBy = [관계 : 'p1', 관계 : 'p2'] 문제가있다. –

답변

1

훅을 Person 클래스에 추가하고 다른 부모를 쿼리 할 수 ​​있습니다. 다른 상위 항목이 없으면 관계를 삭제할 수 있습니다. 두 키의 관계가 모두 FK이므로 두 부모를 모두 삭제해야 할 수도 있으므로 외래 키 위반이 발생합니다.

0

또한

incomingRelations 및 outgoingRelations는 (해당되는 경우 도메인에) 구별하기 위해 사용할 수있는 단어를 보이는 사람

2 Relationshipcollections을 정의 할 수 있습니다.

당신은 모두 relationshipcollections의 결합 반환 만 게터와 일시적인 속성 관계를 정의 할 수

class Person { 
    Relationship incomingRelations 
    Relationship outgoingRelations 
    static mappedBy = [incomingRelations:'p1', outgoingRelations:'p2'] 

    static transients = ['relations'] 

    Set getRelations() { 
     //creates a new collection as union of the old ones 
     return Collections.unmodifiableSet(this.incomingRelations + this.outgoingRelations) 
    } 
} 
class Relationship { 
    static belongsTo = [p1:Person, p2:Person] 
} 

(수정하지해야하는 불변의/그 변화는 아무 의미도하지 않습니다 가능성이 가장 높은 것) 만약 내가 맞지 않는다면 나는 Miguel-Ping이 제안한 짝수 접근법을 시도 할 것이다.