2012-11-07 9 views
8

Ich arbeite mit Legacy-Datenbank und habe eine Viele-zu-Viele-Verbindung mit einer Join-Tabelle, die ich weitgehend aufgelöst habe, da die Mappings gut funktionieren . Aber es gibt eine zusätzliche Spalte und im Fall von Book, Author-Modell lässt sich sagen, dass die nm_author_books ein Feld namens "Royalty" enthalten. Frage: Wie kann ich aus jeder Richtung auf dieses Feld zugreifen?GORM-Viele-zu-Viele-Mapping und mit einem zusätzlichen Feld kombinierbar

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'] } 
} 

Wenn die nm_author_book Tabelle hat [nm_book_id, nm_author_id, abgabe] was ist der Weg, um die Lizenz zugreifen?

Antwort

7

Sie könnten ein Domänenobjekt erstellen, das diese Join-Tabelle modelliert. Anstatt also die Zuordnung für Buch und Autor zu ändern, müssen Sie auf die AuthorBookRoyalty-Domäne verweisen.

Class AuthorBookRoyalty { 
    Author author 
    Book book 
    Long royalty 
} 

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

Tun Sie ähnliches für den Autor und Sie können jetzt mit den Lizenzgebühren umgehen. Möglicherweise müssen Sie die Zuordnung in der Join-Tabelle anpassen, damit sie der aktuellen Datenbank zugeordnet wird.

+0

Danke - das könnte funktionieren! – rks

+0

Hoffe, es hilft es nicht genau das gleiche, aber es sollte zumindest die meisten der gleichen Funktionalität geben. –

11

Die Grundidee ist Wechsel von 1 many-to-many bis 2 many-to-one: ein Buch hat viele BookAuthorDetail und ein Autor viele 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] 
} 

zuzugreifen Lizenz von BookAuthorDetail hat, können Sie tun: BookAuthorDetail.findAllByBookAndAuthor(bookInstance, authorInstance)

+0

Bitte nicht "Danke" als Antwort hinzufügen. Sobald Sie genügend [Reputation] (http://stackoverflow.com/help/whats-reputation) haben, können Sie [Fragen und Antworten abstimmen] (http://stackoverflow.com/help/privileges/vote-), die Sie hilfreich fanden. – Beterraba

+0

Ich habe meine Antwort aktualisiert, also kannst du für mich abstimmen? Ich versuche, mein Antwortproblem zu beheben – hakuna1811

+0

Hallo dort. Ich habe es nicht abgelehnt. Ich werde dich stattdessen ansprechen. – Beterraba