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

时间:2015-08-20 09:33:07

标签: grails

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

class Book{

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

    }



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

我怀疑的是,在第一个例子中明确声明变量是可选的还是第一个定义与第二个定义不同?谢谢!

2 个答案:

答案 0 :(得分:2)

最终结果在数据库级别上相同 - book表将author_id列作为author表的外键。

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

答案 1 :(得分:2)

它们是相同的,但它们并不明显。在第二个示例中,即使您没有声明Author属性,也可以使用一个属性,因为Grails使用AST变换为您添加属性。 belongsTo属性是地图;密钥(author)用作变量名称,值用作类型。所以第一个例子中的Author author属性是多余的,因为它会在编译时为你添加。

包含它并没有什么坏处,并且可以帮助一个不具备Grails感知能力且自动完成的IDE。

同样,Grails会添加Long idLong 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属性。