是否有必要将belongsTo变量显式定义为grails域属性?

是否有必要将belongsTo变量显式定义为grails域属性?,grails,Grails,我想知道这两个定义之间的区别是什么: class Book{ String title Author author static belongsTo = [author: Author] } class Book { String title static belongsTo = [author: Author] } 我的疑问是,在第一个示例中显式声明变量是可选的,还是第一个定义与第二个定义不同?谢谢 数据库级

我想知道这两个定义之间的区别是什么:

class Book{

        String title
        Author author   
        static belongsTo = [author: Author]

    }



class Book {
   String title
   static belongsTo = [author: Author]
}

我的疑问是,在第一个示例中显式声明变量是可选的,还是第一个定义与第二个定义不同?谢谢

数据库级的最终结果相同-book表将有一个
author\u id
列作为
author
表的外键


belongsTo
-设置保存/删除的级联行为,并提供对author的反向引用,因此您可以执行
bookInstance。author

最终结果在数据库级别相同-book表将有一个
author\u id
列作为
author
表的外键


belongsTo
-设置保存/删除的级联行为,并提供对author的反向引用,因此您可以执行
bookInstance。author

它们是相同的,但原因不清楚。在第二个示例中,即使您没有声明
Author
属性,也有一个属性,因为Grails使用AST转换为您添加属性。
belongsTo
属性是一个映射;键(
author
)用作变量名,值用作类型。因此,第一个示例中的
Author
属性是多余的,因为它会在编译时为您添加

包含它并没有什么坏处,而且可以帮助不太了解Grails的IDE实现自动完成

类似地,Grails添加了
Long id
Long version
属性(如果
mapping
块中有
version false
,则省略该版本),这样您就可以将它们添加到代码中,但它们也是多余的。当然,如果您需要更改id的类型,您将是显式的

如果您在
Author
类中有
hasMany
属性,例如

static hasMany = [books: Book]
Grails还将基于该声明添加一个属性。属性也是一个映射,值指定集合元素的类型,键指定属性名称。所以实际上你得到了一个

Set<Book> books
但前提是在数据库中对它们进行排序是有意义的

注意,这些变量名只是约定。您可以随意命名
作者
和图书属性,例如

static belongsTo = [writer: Author]
这将添加一个
作者编写器
属性,以及

static hasMany = [tomes: Book]

这将添加一个
Set tomes
属性。

它们是相同的,但原因不明显。在第二个示例中,即使您没有声明
Author
属性,也有一个属性,因为Grails使用AST转换为您添加属性。
belongsTo
属性是一个映射;键(
author
)用作变量名,值用作类型。因此,第一个示例中的
Author
属性是多余的,因为它会在编译时为您添加

包含它并没有什么坏处,而且可以帮助不太了解Grails的IDE实现自动完成

类似地,Grails添加了
Long id
Long version
属性(如果
mapping
块中有
version false
,则省略该版本),这样您就可以将它们添加到代码中,但它们也是多余的。当然,如果您需要更改id的类型,您将是显式的

如果您在
Author
类中有
hasMany
属性,例如

static hasMany = [books: Book]
Grails还将基于该声明添加一个属性。属性也是一个映射,值指定集合元素的类型,键指定属性名称。所以实际上你得到了一个

Set<Book> books
但前提是在数据库中对它们进行排序是有意义的

注意,这些变量名只是约定。您可以随意命名
作者
和图书属性,例如

static belongsTo = [writer: Author]
这将添加一个
作者编写器
属性,以及

static hasMany = [tomes: Book]
这将添加一个
Set tomes
属性