我试图在Grails中的两个域类之间实现两种不同类型的关系。

考虑以下; 我有两个域类,一个作者和书类,作者有很多书。

class Author{           
   String name 
}

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

}

以上描述了作者和书之间非常基本的一对多关系。 但我也希望作者有一个喜欢的书籍列表的概念。 理想情况下,这将表示为单独的一对多关系,将同一Book对象描述为列表并保持原样。

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]

}

我试图像上面那样描述这个(在许多其他方法中)并且最终没有创建数据库表(favourite_books)。 我没有得到任何错误。 这是我能想到的唯一方法,不使用任何额外的对象,我希望避免使模型保持简单。 我觉得我走在正确的轨道上,但也许错过了一些重要的拼图。

任何帮助将非常感激。

===============>>#1 票数:4

首先,让我们确保正确理解您的问题。 您有BookAuthor域类,但这些类之间有两种关系:

  1. 作者写书,因此AuthorBook之间存在一对多的关系。 当然,在现实生活中,许多作者可能会写一本书,但在这种情况下,我们可以忽略这一点。
  2. 作者有最喜欢的书籍,因此AuthorBook之间存在第二个多对多关系。 这种关系是多对多的,因为一本特定的书可能是许多作者的最爱。

所以假设我已经正确理解了问题,让我们试着找到一个解决方案。 首先,让我们添加多对多关系(最喜欢的书籍):

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

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

每当定义多对多关系时,我们必须选择一方作为关系的所有者。 在这种情况下,我已经指定

static belongsTo = Author

Book类中,因此Book是关系的所有者,而Author是所有者。 因此,我们应该将最喜欢的书籍添加到作者而不是反之亦然, 请参阅此处了解更多详情。

然后可以添加一对多关系:

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

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

    Book writtenBy
}

顺便说一句,在您的域模型中,您在Author类中包含以下内容

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

这将导致连接表被命名为favourite_books ,而在我的模型中,连接表将默认为author_favourites 如果由于某种原因你特别想要将连接表命名为这样(例如,您正在尝试将类映射到现有表),那么请随意包含上述内容。

最后,如果您发现自己正在努力定义域类映射,并且更熟悉创建表,然后从它们生成域类,请查看此插件

===============>>#2 票数:2 已采纳

终于搞清楚了。 感谢Don让我指向db-reverse-engineer插件的方向,这有助于公开允许这种映射策略的关键属性。 基本上,所有这些都归结为使用GORM的mappedBy关联设置来明确告诉Grails如何映射多个hasMany引用。 有效的类文件如下:

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

再次感谢您的帮助

===============>>#3 票数:1

修改Book域类。 删除author映射。

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

一旦cleanrun-app查找新表FAVORITE_BOOKS。

  ask by dre translate from so

未解决问题?本站智能推荐:

关注微信公众号