2012-05-01 4 views
4

비교적 단순한 Grails 프로젝트에서 캐스케이드 삭제 동작을 생성하는 올바른 구성을 만들기 위해 애를 쓰고 있습니다. 나는 저자를 만들 경우Grails (GORM) 다 대일 캐스케이드 삭제 동작

class Author { 
    String name 
    static constraints = { 
    } 
} 

class Book { 
    String title 
    Author author 
    static constraints = { 
    } 
} 

하고 해당 저자에 의해 쓰여진 책을 만들고, 내가 삭제할 수 없습니다입니다 :

나는 다음과 같은 간단한 도메인 클래스를 말해봐 먼저 수동으로 책을 삭제하지 않고 작성자. 나는 "무결성 제약 위반 (Integrity constraint violation)"을 받는다. 이것은 "책"테이블의 "저자"열에 "제한"으로 "외래 키 제약 조건"이있는 MySQL (내 기본 데이터베이스)이 Grails에서 작성 되었기 때문에 놀라운 일이 아닙니다 (이 동작은 Grails의 기대치와 일치합니다 내가 그것을 이해할 때 문서화).

이제 책 테이블의 "작성자"열의 기본 데이터베이스 제약 조건을 "제한"에서 "계단식"으로 수동으로 변경하면 원하는 동작이 나타납니다. 즉, 작성자를 삭제하면 모든 서적도 삭제됩니다.

그래서 저자 컬럼에서 "on delete cascade"가있는 "book"테이블을 만드는 방식으로 Grails "Book"클래스를 변경하고 싶습니다. 나는 이런 종류의 일을하는 것에 대한 많은 정보와 "belongsTo"와 명시적인 "매핑"을 사용하는 GORM 기본값을 읽었습니다.

Author author 

static belongsTo = [author: Author] 
이것

그것을 만드는

에 "belongsTo를"설명서에 따라이 작업을 수행 할 수

한 가지 방법은에서 예약 클래스의 라인을 변경하는 것 같았다 저자가 관계의 "소유주"임을 명시합니다. 설명서를 보면 이것이 내가 수행하고있는 계단식 삭제 동작을 생성해야한다고 제안하는 것 같습니다. 그러나 명시 적으로 "hasMany = [books : Book]"을 Author 클래스에 추가하지 않으면 작동하지 않습니다. 나는 이것을 원하지 않는다. (이 소원은 실제 사업 영역에서 더 의미가 있지만, 이해의 연습과 마찬가지로 저자 도메인 클래스에서 명시 적으로 책에 대해 알고 있어야하는 이유는 아직 없습니다.

Grails 설정을 사용하여 Author 클래스를 변경하지 않고도 데이터베이스에서 "계단식 삭제"설정을 생성하도록 Book 클래스를 변경하고 싶습니다. 나는 명시적인 매핑을 사용하여 시도 :

static mapping = { 
     author cascade: 'all' 
} 

및 기타 명시 적 매핑 또는 "belongsTo"옵션과 조합. 이것은 작동하지 않았다.

기본 SQL 데이터베이스의 "제약 조건"을 간단히 변경하면 내가 원하는 동작을 제공한다는 것을 알게되면 Grails를 통해이를 얻을 수있는 방법이 있습니까? 그렇지 않다면, 나는 여기서 뭔가 근본적인 것을 잘못 이해했거나 바보 같은 짓을하려고합니까?

+0

어떤 Grails 버전을 사용하고 있습니까? –

답변

2

입력란 에 필수 입력란이 누락되었습니다.당신이 볼 수 있듯이

@TestFor(Author) 
@Mock([Book]) 
class AuthorTests { 

    @Test 
    void testAuthorBookCascades() { 

     Author a = new Author(name: "Douglas Adams") 
     Book b = new Book(name: "So Long, and Thanks for all the Fish") 
     a.book = b 
     a.save() 

     assert Author.count() == 1 
     assert Book.count() == 1 

     a.delete() 

     assert Author.count() == 0 
     assert Book.count() == 0 
    } 
} 

, 당신은 책 인수가 필요합니다 : 여기

는 문서에 따라입니다 (테스트 및 작동) 샘플 코드,

class Author { 

    String name 
    Book book //you are probably missing this field 

    static constraints = { 
    } 
} 

class Book { 

    String name 

    static belongsTo = [author: Author] 

    static constraints = { 
    } 
} 

테스트 케이스의 저자. hasMany 또는 hasOne 절은 필요 없습니다.

+0

Segar에게 감사드립니다.하지만 필자는 Author 클래스/테이블을 수정하는 방법을 찾지 않기를 바랬습니다. 어떻게 든 책 테이블의 캐스케이드 동작을 수정하는 것입니다. 그러나, 당신은 이것이 효과가 있다고 옳습니다 (개요에 대한 노력에 감사드립니다). 나는 당신이 말한 것이 "옳은"방법이라고 생각하기 시작했습니다. 그리고 제가 묻는 것은 바로 사용 가능한 GORM으로 설계된 것이 아니라는 것입니다. – Glennn

+0

@ 글렌 네, 네가 묻는 것은 그렇게해서는 안되기 때문에 정의되지 않았다. 그것은 최대 절전 모드가 지정하지 않은 제약 조건을 생성 할 것이고 모두가 연속 삭제를 원한다는 것을 의미합니다. – GalmWing

+0

@Glennn - 외부 제약 조건이있는 경우 원하는 캐스케이드 모양의 동작을 수행 할 삭제 기능을 직접 작성하는 것이 가장 좋습니다. GORM이 GalmWing이 말하는 것은 정확합니다. –