Grails属于关系机制

时间:2015-03-20 00:05:52

标签: grails

Owner域类拥有Owned域类的Grails关系中,我看到这在Owned域类中声明了两种不同的方式:

static belongsTo [ owner : Owner ]

有时候是

static belongsTo [ Owner ]

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

3 个答案:

答案 0 :(得分:3)

区别在于能够指示属性所拥有的名称。在第二种情况下,它将假设类owner的bean名称约定,其中第一个是明确表示属性的名称。

这是关于灵活性的。如果第二个选项没有达到您想要或想要的效果,那么第一个选项就在那里。

答案 1 :(得分:3)

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

Owner owner

Owner theOwner

如果您已将belongsTo声明为

static belongsTo = [theOwner: Owner]

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

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

static hasMany = [owned: Owned]

创建等效的

Set<Owned> owned

在字节码中。

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

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

我发现schema-export脚本对于这样的东西非常有帮助。对于语法的每个变体,运行

grails compile
grails schema-export

并查看target/ddl.sql的内容,以查看域类的结果表结构。

答案 2 :(得分:2)

它很简单: 如果你定义

static belongsTo = [ owner : Owner ]

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

static belongsTo = [ Owner ]

然后你就可以了(我猜你会得到NoSuchPropException)。

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