我正在尝试在 Grails 中的两个域类之间实现两种不同类型的关系。
考虑以下;我有两个域类,一个 Author 和 Book 类,其中一个 Author 拥有很多书籍。
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
是业主。因此,我们应该向作者添加最喜欢的书籍,而不是相反,see here了解更多详情。然后可以添加一对多关系:
class Author {
String name
static hasMany = [favourites: Book, booksWritten: Book]
}
class Book {
String title
static hasMany = [favouritedBy: Author]
static belongsTo = Author
Book writtenBy
}
顺便说一句,在您的域模型中,您在
Author
中包含了以下内容类(class)static mapping = {
favouriteBooks joinTable: [name: 'favourite_books', key: 'author_id']
}
这将导致连接表被命名为
favourite_books
,而在我的模型中,连接表将默认为 author_favourites
.如果由于某种原因您特别希望连接表被命名为这样(例如,您试图将类映射到现有表),那么请随意包含上述内容。最后,如果您发现自己在定义域类映射方面苦苦挣扎,并且更习惯于创建表,然后从它们生成域类,请查看 this plugin
关于Grails:两个域对象之间的多重关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16048674/