[英]Grails: multiple relationships between two domain objects
我试图在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)。 我没有得到任何错误。 这是我能想到的唯一方法,不使用任何额外的对象,我希望避免使模型保持简单。 我觉得我走在正确的轨道上,但也许错过了一些重要的拼图。
任何帮助将非常感激。
首先,让我们确保正确理解您的问题。 您有Book
和Author
域类,但这些类之间有两种关系:
Author
和Book
之间存在一对多的关系。 当然,在现实生活中,许多作者可能会写一本书,但在这种情况下,我们可以忽略这一点。 Author
和Book
之间存在第二个多对多关系。 这种关系是多对多的,因为一本特定的书可能是许多作者的最爱。 所以假设我已经正确理解了问题,让我们试着找到一个解决方案。 首先,让我们添加多对多关系(最喜欢的书籍):
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
。 如果由于某种原因你特别想要将连接表命名为这样(例如,您正在尝试将类映射到现有表),那么请随意包含上述内容。
最后,如果您发现自己正在努力定义域类映射,并且更熟悉创建表,然后从它们生成域类,请查看此插件
终于搞清楚了。 感谢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]
}
再次感谢您的帮助
修改Book
域类。 删除author
映射。
class Book{
String title
static belongsTo = [Author]
}
一旦clean
并run-app
查找新表FAVORITE_BOOKS。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.