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 - grails “test-app”无法通过功能性geb + spock测试,但是 “test-app -functional”成功

    grails - Grails不区分大小写的URL是否预定义URL映射?

    grails - 命令对象验证奇怪的行为

    mysql - 如何在 list.gsp 中显示链接表值而不是 id? chalice

    grails - 在 Grails 中将自定义 id 生成定义为默认值的最佳方法是什么?

    grails - 如何在grails中将值设置为空对象

    ajax - Grails和AJAX:使用ModalBox或YUI2对话框可以进行Grails表单验证吗?

    grails - 外部Tomcat 7上的Grails 3中的 Assets 管道不包括CSS或JS

    hibernate - GORM IdentityEnumType 与 Grails 2.5.6 映射 NPE

    groovy - 引用 Grails GORM 中的引用表的域对象