Grails belongsTo 关系机制

Grails belongsTo relationship mechanism

Owner 域 class 拥有 Owned 域 class 的 Grails 关系中,我在 [=13] 中看到了两种不同的声明方式=] 域 class:

static belongsTo [ owner : Owner ]

有时

static belongsTo [ Owner ]

除了语法之外,这两者之间有什么区别?

不同之处在于能够指示 属性 拥有的名称。在第二种情况下,它将采用 class owner 的 bean 名称约定,而在第一种情况下,您要明确 属性.

的名称

这与灵活性有关。如果第二个选项没有按照您的意图或想要的那样进行,则第一个选项就在那里。

就这么简单: 如果您定义

static belongsTo = [ owner : Owner ]

然后您可以访问 owner 作为变量:obj.owner。如果你写:

static belongsTo = [ Owner ]

那么你不能(我猜你会得到 NoSuchPropException)。

在这两种情况下都创建了外键关系

第一个是双向的,因为您在 class 中定义了 Owner 的实例。该映射的键通常是域的小写名称 class,但它可以是任何合法的变量名称。 AST 转换将 属性 添加到您的域 class (您可以通过反编译 .class 文件看到这一点),基本上

Owner owner

Owner theOwner

如果您已将 belongsTo 声明为

static belongsTo = [theOwner: Owner]

尽管不要自己添加 - 它已经存在于字节码中。

这类似于声明一个 hasMany,其中该映射的键定义了一个集合(默认为 Set,但可选 List)。例如。声明

static hasMany = [owned: Owned]

创建相当于

Set<Owned> owned

在字节码中。

第二个不是双向的,因为没有直接的方法到达拥有的实例。

方向性对table结构有影响。首先,您得到了您可能期望的结果 - Owned 域 class table 中的 owner_id 列,它是 Owner 域的外键 class table。但在第二个中,没有域 class 属性 与外键关联,因此在这种情况下,第三个 table 被创建为连接 table ,类似于多对多关系的情况。

我发现 schema-export 脚本对这类事情很有帮助。对于每个语法变体,运行

grails compile
grails schema-export

并查看 target/ddl.sql 的内容以查看针对您的域 classes 生成的 table 结构。