grails设置域关系

时间:2014-12-11 21:33:31

标签: grails relationship

所以,有hasMany和belongsTo。例如,我有一个这样的类:

class Book {

String name

static belongsTo = [creator:User]

}

我可以这样做:new Book(name:"some name")。但我能设置这样的创作者吗?

def user = new User(name:Bob)
def book = new Book(creator:user)

或更晚book.creator = user

creator的行为是否像字段一样?

如果有一个hasMany怎么办,例如:

class User {

String name
String password
static hasMany = [createdBooks:Book]

}

这里的createdBooks是否像我可以通过user.createdBooks.add(book)方法访问的数组一样?


我放弃了,显然这段代码有问题:

    def book = new Book(name:params.bookName)

    book.creator = session.user
    book.save()
    session.user.createdBooks.addTo(book)
    session.user.save()

没有例外,但在启动时,我的索引页面显示为404未找到。这部分代码打破了一切,我完全迷失了什么以及为什么会发生在这里。

1 个答案:

答案 0 :(得分:2)

在第一个示例中,AST转换添加了User creator属性,在第二个示例中,它添加了Set createdBooks属性。两者都被添加到字节码中,而不是元类,因此Java可以调用这些属性,这很重要,因为Hibernate对GORM一无所知,只能使用真实的方法和字段。

您可以设置您正在做的创建者,也可以直接添加到createdBooks集合,但使用addToremoveFrom方法可以做更多事情 - 他们会初始化该集合如果为null,并且还在Book类中设置了后向引用,以使内存尽可能接近保存后数据库中的内容。

编辑,基于更新的问题:

你可以做你所描述的大部分内容,但基本上没有理由因为你想要做的事情可以做到"正常"办法。你似乎没有Java / Groovy背景 - 我猜猜你因为你想要一切都是一个数组吗?这太棒了 - 你很快就会得到这个。但是,避免试图强迫你对代码应该如何工作的期望,除非你正在试验看什么有效,以及它什么时候会破坏,当你试图做那些事情时你不应该抱怨太多不要像在线参考文档那样。 addToBooks / removeFromBooks动态方法是您正在寻找的,但文档也提供了对大局的理解。

阅读the docs并获得一本或两本好的入门书籍。在grails.org的Books page中引用了几个。 " Grails 2:快速入门指南"是最容易上手的,而权威指南和Grails in Action也非常易读,但非常全面,首先介绍了Groovy并完成了所有核心功能。所有3个都有您可以在阅读时使用的示例应用程序。