在Owner
域类拥有Owned
域类的Grails关系中,我看到这在Owned
域类中声明了两种不同的方式:
static belongsTo [ owner : Owner ]
有时候是
static belongsTo [ Owner ]
除了语法之外,这两者之间有什么区别?
答案 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)。
在这两种情况下都会创建外键关系