10

私はレガシーデータベースを使用しており、マッピングが正常に機能しているため、結合テーブルとの多対多の関連付けを大幅に解決しました。ただし、追加の列があり、Bookの場合、Authorモデルでは、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]がある場合、ロイヤリティにアクセスする方法は何ですか?

4

2 に答える 2

13

基本的な考え方は、1対多から2多対1に変更することです。本には多くの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)

于 2014-06-17T14:18:41.757 に答える
7

テーブルを結合するモデルを作成するドメインオブジェクトを作成して、BookとAuthorのマッピングを変更する代わりに、AuthorBookRoyaltyドメインを指すようにすることができます。

Class AuthorBookRoyalty {
  Author author
  Book book
  Long royalty
}

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

著者についても同様のことを行うと、使用料を処理できるようになります。結合テーブルのマッピングを調整して、現在のデータベースにマップする必要がある場合があります。

于 2012-11-07T14:14:45.023 に答える