我想知道这两个定义之间的区别是什么:
class Book{
String title
Author author
static belongsTo = [author: Author]
}
class Book {
String title
static belongsTo = [author: Author]
}
我怀疑的是,在第一个例子中明确声明变量是可选的还是第一个定义与第二个定义不同?谢谢!
答案 0 :(得分:2)
最终结果在数据库级别上相同 - book表将author_id
列作为author
表的外键。
belongsTo
- 设置保存/删除的级联行为并提供对作者的反向引用,因此您可以执行bookInstance.author
答案 1 :(得分:2)
它们是相同的,但它们并不明显。在第二个示例中,即使您没有声明Author
属性,也可以使用一个属性,因为Grails使用AST变换为您添加属性。 belongsTo
属性是地图;密钥(author
)用作变量名称,值用作类型。所以第一个例子中的Author author
属性是多余的,因为它会在编译时为你添加。
包含它并没有什么坏处,并且可以帮助一个不具备Grails感知能力且自动完成的IDE。
同样,Grails会添加Long id
和Long version
属性(如果version false
块中有mapping
,则省略该版本),这样您就可以将它们添加到您的代码中但是它们和#39; d也是多余的。当然,如果您需要更改id的类型,那么您将是明确的。
如果hasMany
类中有Author
属性,例如
static hasMany = [books: Book]
Grails还会根据该声明添加一个属性。属性再次是一个映射,值指定集合元素的类型,键指定属性名称。所以实际上你得到了一个
Set<Book> books
属性。您可以将其添加到您的代码中(通常没有通用类型Set books
),但这是不必要的,因为大多数IDE都知道Grails添加的内容。
如果要将默认Set
类型更改为List
,则可以将该属性添加到代码中:
List books
但只有在数据库中订购它们才有意义。
请注意,这些变量名称只是约定。您可以根据需要为Author
和书籍属性命名,例如
static belongsTo = [writer: Author]
将添加Author writer
属性和
static hasMany = [tomes: Book]
会添加Set tomes
属性。