Отображение GORM many-to-many и jointable с дополнительным полем

Я работаю с устаревшей базой данных и имею связь "многие ко многим" с таблицей соединений, которую я разрешил в значительной степени, поскольку сопоставления работают нормально. Но есть дополнительный столбец, и в случае книги авторская модель позволяет сказать, что nm_author_books содержит поле под названием "royalty". Вопрос в том, как получить доступ к этому полю с любого направления?

class Book {
    String title
    static belongsTo = Author
    static hasMany = [authors: Author]
    static mapping = { authors joinTable: [name: "mm_author_books", key: 'mm_book_id' ] } 
}
class Author {
    String name
    static hasMany = [books: Book]
    static mapping = { books joinTable: [name: "mm_author_books", key: 'mm_author_id'] } 
}

если таблица nm_author_book имеет [nm_book_id, nm_author_id, royalty], то как получить доступ к роялти?

2 ответов


вы можете сделать объект домена, который моделирует, которые присоединяются к таблице, поэтому вместо изменения сопоставления для книги и автора они указывают на домен AuthorBookRoyalty.

Class AuthorBookRoyalty {
  Author author
  Book book
  Long royalty
}

class Book {
  String title
  static belongsTo =Author
  Static hasMany[authors: AuthorBookRoyalty]
}

сделать подобное для автора, и теперь вы можете иметь дело с роялти. Возможно, потребуется настроить сопоставление в таблице соединений, чтобы оно соответствовало текущей базе данных.


основная идея состоит в изменении от 1 Много-ко-многим до 2 много-к-одному: книга имеет много BookAuthorDetail и автор имеет много BookAuthorDetail

class Book {
    String title

    static hasMany = [details: BookAuthorDetail]
}
class Author {
    String name
    static hasMany = [details: BookAuthorDetail]
}

class BookAuthorDetail {
    String royalty
    static belongsTo = [book: Book, author: Author]
}

чтобы получить доступ к роялти по BookAuthorDetail, вы можете сделать:BookAuthorDetail.findAllByBookAndAuthor(bookInstance, authorInstance)