gpt4 book ai didi

Grails:两个域对象之间的多重关系

转载 作者:行者123 更新时间:2023-12-04 14:14:39 25 4
gpt4 key购买 nike

我正在尝试在 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)。我没有收到任何错误。这是我能想到的不使用任何额外对象的唯一方法,我想避免保持模型简单。
我觉得我在正确的轨道上,但可能错过了拼图的一些重要部分。

任何帮助将非常感激。

最佳答案

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

  • 作者写书,所以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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com