Отображение 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)