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)
其中 brazil
和 france
是 Country
的实例。