(快速参考)

嵌入

目的

支持将域组件嵌入域类中 - 亦即称为 组合

示例

给定以下域类

class Person {

    String name
    Country bornInCountry
    Country livesInCountry

    static embedded = ['bornInCountry', 'livesInCountry']
}

// If you don't want an associated table created for this class, either
// define it in the same file as Person or put Country.groovy under the
// src/main/groovy directory.
class Country {
    String iso3
    String name
}

Grails 会生成一个类似以下内容的 person 数据库表

字段 类型

NAME

VARCHAR(255)

BORN_IN_COUNTRY_ISO3

VARCHAR(255)

BORN_IN_COUNTRY_NAME

VARCHAR(255)

LIVES_IN_COUNTRY_ISO3

VARCHAR(255)

LIVES_IN_COUNTRY_NAME

VARCHAR(255)

描述

嵌入组件不会将其数据存储在它自己的表中,如同常规域类关系中那样。相反,数据包含在所有者的表中。所以,在上例中,Country 字段会显示在 person 表中。这意味着查询更快,因为无需联接,但您可能最终得到表中的重复数据。

嵌入组件类通常与拥有类声明在同一个源文件中或位于 src/main/groovy 下的自身文件中。您可以将组件类放在 grails-app/domain 下,但如果您这样做,Grails 会自动为其创建一个专用表。通常最好的做法是将类放在 src/main/groovy 下,因为您然后可以在多个域类中共享组件。

查询嵌入属性与查询常规关系没有任何不同,所以您仍可以执行以下操作

Person.findAllByBornInCountry(brazil)
Person.findAllByLivesInCountry(france)

其中 brazilfranceCountry 的实例。