2013-04-16 4 views
5

Grails의 두 도메인 클래스 사이에 두 가지 유형의 관계를 구현하려고합니다.Grails : 두 도메인 객체 간의 다중 관계

다음을 고려하십시오. 저는 두 권의 도메인 클래스를 가지고 있는데 저자와 책 클래스에는 많은 책이있는 저자가 있습니다.

class Author{   
    String name 
} 

class Book{ 
    String title 
    static belongsTo = [author:Author] 

} 

위의 내용은 저자와 도서 간의 매우 기본적인 일대 다 관계를 나타냅니다. 하지만 저자가 좋아하는 책 목록 개념을 원합니다. 이것은 이상적으로 목록과 동일한 Book 객체를 설명하고 그 자체로 유지되는 별개의 일 대 다 관계로 표현됩니다.

class Author{   
    String name 
    static hasMany = [favouriteBooks: Book] 

    static mapping = { 
     favouriteBooks joinTable: [name: 'favourite_books', 
       key: 'author_id'] 
    } 
} 

class Book{ 
    String title 
    static belongsTo = [client:Client] 

} 

I는 (많은 다른 방법들 중에서) 위에서이를 설명하기 위해 시도하고 궁극적 데이터베이스 테이블 (favourite_books)가 생성되지 않는다. 나는 어떤 오류도 내지 않는다. 이것은 제가 모델을 단순하게 유지하기 위해 피하고 싶지 않은 여분의 객체를 사용하지 않고 이것을 수행 할 수있는 유일한 방법입니다. 나는 옳은 길을 가고 있지만 퍼즐의 중요한 부분을 놓쳤을 것이라고 느낍니다.

도움을 주시면 감사하겠습니다.

+0

은 당신이 노력이 도움 ** 깨끗하고 출구를 한 후, 다시 **, Grails의 ** ** - 응용 프로그램을 실행 다음과 같이 일 클래스 파일입니다. 때때로 grails는 도메인을 깨끗하게하지 않으면 도메인 변경을받지 못한다. – ikumen

+0

위의 첫 번째 예에서 '저자'쪽에 hasMany 속성이없고 두 번째 예에서 'favouriteBooks'관계에 대한 참조가 없다. '책 '쪽. –

답변

2

마지막으로이 알아 냈 확인하십시오. Don에게이 매핑 전략을 허용하는 핵심 속성을 공개하는 데 도움이되는 db-reverse-engineer 플러그인의 방향을 알려 주셔서 감사합니다. 기본적으로 GORM의 mappedBy 연관 설정을 사용하여 Grails에 여러 hasMany 참조를 매핑하는 방법을 명시 적으로 알려줍니다.

class Author { 

    String name 
    static hasMany = [books: Book, favourites: Book] 

    // need to disambiguate the multiple hasMany references with the 
    // 'mappedBy' property: 
    static mappedBy = [books: "author", 
         favourites: "authors"] 
} 

class Book { 

    String title 
    Author author 

    static hasMany = [authors: Author] 
    static belongsTo = [Author] 
} 

감사를 다시

1

수정 Book 도메인 클래스. author 매핑을 삭제하십시오. 새 테이블에 대한

class Book{ 
    String title 
    static belongsTo = [Author] 
} 

봐 한 번 cleanrun-app FAVORITE_BOOKS.

4

우선, 문제를 올바르게 이해하도록하겠습니다. 당신은 BookAuthor 도메인 클래스를 가지고 있지만, 이러한 클래스 사이에 두 관계가 있습니다 :

  1. 저자는 책을 쓰는, 그래서 AuthorBook 사이에 일대 다 관계가있다. 물론 실생활에서 많은 저자가 책을 쓸 수는 있지만,이 경우에는 이것을 무시할 수 있습니다.
  2. 저자는 가장 좋아하는 책을 가지고 있으므로 AuthorBook 사이에 두 번째 다 대다 관계가 있습니다. 특정 책이 많은 저자의 마음에 드는 책일 수 있기 때문에이 관계는 다 대 다입니다.

그래서 문제를 올바르게 이해했다고 가정하고 해결책을 찾아 보겠습니다. 우선,의는 다 대다 관계 (좋아하는 책)을 추가 할 수 있습니다 :

class Author { 
    String name 
    static hasMany = [favourites: Book] 
} 

class Book { 
    String title 
    static hasMany = [favouritedBy: Author] 
    static belongsTo = Author 
} 

대다 관계는 우리가 관계의 소유자로서 한쪽을 선택해야 정의 할 때마다. 이 경우 나는 그렇게 Book는 관계의 소유 측면과 Author은 소유자의 Book 클래스

static belongsTo = Author 

을 지정했습니다. 이 때문에 우리는 더 많은 세부 사항을 위해 선호 도서를 저자에게, 반대로는 see here을 추가해야합니다.

는 일대 다 관계가 다음에 추가 할 수 있습니다

:

static mapping = { 
    favouriteBooks joinTable: [name: 'favourite_books', key: 'author_id'] 
} 

이 원인이됩니다 그런데

class Author { 
    String name 
    static hasMany = [favourites: Book, booksWritten: Book] 
} 

class Book { 
    String title 
    static hasMany = [favouritedBy: Author] 
    static belongsTo = Author 

    Book writtenBy 
} 

, 당신의 도메인 모델에 당신하여 Author 클래스에 다음을 포함 내 모델에서 조인 테이블은 author_favourites으로 기본 설정되는 반면, 명명 된 조인 테이블은 favourite_books입니다. 어떤 이유로 인해 조인 테이블의 이름이 이와 같이 지정되도록하려는 경우 (예 : 클래스를 기존 테이블에 매핑하려는 경우) 위의 내용을 자유롭게 포함하십시오. 당신은 자신이 도메인 클래스 매핑을 정의하는 어려움을 겪고 찾은 다음, 테이블을 만들고 그들로부터 도메인 클래스를 생성하는 더 편안 경우

마지막으로, this plugin

+0

신속하고 자세한 답변을 보내 주셔서 감사합니다. 당신은 내가 성취하고자하는 것에 대한 당신의 해석에 맞고, 그것이 효과가있는 동안, 나는이 접근법에 작은 문제가있는 것처럼 보입니다. 필자가 책을 소유하고있는 소유권을 매핑하기 위해 별도의 author_books_written 테이블로 끝나는 것 같습니다. 내 책 테이블에 author_id가 있으면 좋겠습니까? 이 문제를 해결할 수 있습니까? – dre

+0

그건 그렇고, 우리는 책이 한 명의 저자 만 가질 수 있다는 가정을 할 수 있습니다. – dre