2013-04-16 24 views
5

Grails'deki iki etki alanı sınıfı arasında iki farklı ilişki türü uygulamaya çalışıyorum.Grails: iki etki alanı nesnesi arasındaki çoklu ilişkiler

Aşağıdakileri dikkate alın; İki alan sınıfım var, bir Yazarın Kitap sahibi olduğu bir Yazar ve Kitap sınıfı var. Bir Yazar ve bir Kitap arasındaki çok fazla ilişkiyi çok açık bir şekilde tasvir etmektedir. Ama aynı zamanda bir Yazarın favori kitapların bir listesi konseptine sahip olmasını istiyorum. Bu, ideal olarak, aynı Kitap nesnesini bir liste olarak tanımlayan ve bu şekilde devam eden bir ilişkiden ayrı olarak temsil edilir.

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] 

} 

ben (birçok diğer yöntemler arasında) yukarıdaki gibi bu tarif çalıştık ve sonuçta veritabanı tablosu (favourite_books) oluşturulmaz. Ben hiç bir hata alamıyorum. Bu, modeli basit tutmak için kaçınmak istediğim ekstra nesneleri kullanmadan bunu düşünebilmemin tek yoludur. Doğru yolda olduğumu hissediyorum ama belki de bulmacanın hayati bir parçasını eksik hissediyorum.

Herhangi bir yardım çok takdir edilecektir.

+0

Eğer çalıştı sahip yardımı ** temiz, çıkış için daha sonra tekrar ** grails ** **-app çalıştırın: şöyle çalışmış sınıf dosyalarıdır. Bazen grails, alan adınızdaki değişiklikleri 'clean' olmadan temizlemez. – ikumen

+0

Yukarıdaki örnekte 'Author 'tarafında' hasMany' özelliğini kaçırıyorsunuz ve ikinci örnekte' favouriteBooks 'bağlantısına dair herhangi bir referans yoktur. 'Kitap' tarafı. –

cevap

2

Nihayet bu anladım göz atın. Bu haritalama stratejisine olanak sağlayan kilit özelliği açığa çıkarmaya yardımcı olan db-reverse-engine eklentisi yönünde beni işaret ettiğin için Don'a teşekkürler. Temel olarak, Grants'a çoklu hasMany referanslarının nasıl haritalanacağını açıkça belirtmek için GORM'nin mappedBy ilişkilendirme ayarını kullanmaya başladı.

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

tekrar teşekkürler

1

Book etki alanı sınıfını değiştirin. author eşlemesini kaldırın. Yeni tablo için

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

Bak kez clean ve run-app FAVORITE_BOOKS.

4

Öncelikle sorununuzu doğru anladığınızdan emin olalım. Sen Book ve Author alanı sınıfları var ama bu sınıfların arasında iki ilişki vardır:

  1. bir yazar kitaplar yazıyor, bu yüzden Author ve Book arasında bire çok ilişki var. Tabii ki gerçek hayatta bir kitap birçok yazar tarafından yazılabilir, ancak bu durumda görmezden gelebiliriz.
  2. Bir yazarda favori kitaplar var, bu nedenle Author ve Book arasında çoktan çok ikinci bir ilişki var. Bu ilişki çoktan çoğa çoktur çünkü belirli bir kitap birçok yazarın gözdesi olabilir.

yüzden doğru sorunu anladım varsayarak, haydi bir çözüm bulmaya çalışalım. Her şeyden önce, en çok-çok ilişkisi (favori kitabı) ekleyelim:

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

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

bir çok-çok ilişki biz ilişkinin sahibi olarak bir tarafı seçmek zorunda tanımlanır zaman. Bu durumda ben çok Book ilişkinin olunan yan ve Author sahibidir Book sınıfında

static belongsTo = Author 

belirlediniz. Bu nedenle, daha fazla ayrıntı için favori kitapları see here yerine yazarlara eklemeliyiz.

bire çok ilişki daha sonra eklenebilir

:

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

Bu neden olacaktır arada

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

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

    Book writtenBy 
} 

, alan modelinde sen Author sınıfında aşağıdaki dahil benim modelimde author_favouritesauthor_favourites için varsayılan olacak, bunun yerine birleştirme tablosu favourite_books olarak adlandırılır. Herhangi bir nedenle, özellikle birleştirme tablosunun bu şekilde adlandırılmasını istiyorsanız (örneğin, sınıfları varolan tablolara eşlemeye çalışıyorsanız), yukarıdakileri dahil etmekte çekinmeyin. Kendinizi alanı sınıfı eşleşmelerin tanımlanmasında ile mücadele bulmak ve sonra, tablolar oluşturma onlardan alanı sınıfları oluşturma ile daha rahat olup olmadığını

Son olarak, this plugin

+0

Hızlı ve ayrıntılı yanıt için teşekkürler. Elime almaya çalıştığım şeylerin yorumunda haklısınız ve çalışırken, bu yaklaşımla küçük bir sorunum var gibi görünüyor. Bir kitabın bir kitabın sahipliğini sahipliğini haritalamak için ayrı bir author_books_written tablosuyla sonuçlanmış gibi görünüyorum. Kitaplar masamda bir author_id sahibi olmayı umuyordum? Bu etrafında almak mümkün mü? – dre

+0

Bu arada, bir Kitabın sadece bir Yazar sahibi olabileceği varsayımını yapabiliriz. – dre

İlgili konular