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 结构。
在 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 结构。