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

标签 grails grails-orm

我正在尝试在 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/

    相关文章:

    Grails GORM,多层领域类的急切获取模式

    grails - 在 Grails 中查询域类关联

    tomcat - 错误没有使用 grails 找到默认容器

    grails - Grails邮件插件出现问题,连接被拒绝:connect

    grails - 在 Grails 中使用聚合函数派生属性

    grails - 带有查询和排序的 HQL 注入(inject)/findAll

    渲染具有多对多关系的复杂表单时 hibernate 未保存的 transient 错误

    grails - 从字符串中仅删除一些字符

    spring - Grails 3 Spring Security 覆盖登录表单

    grails - 在没有 Grails neo4j-plugin 和 GORM 的情况下在 Grails 中使用 Neo4j