所以,有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未找到。这部分代码打破了一切,我完全迷失了什么以及为什么会发生在这里。
答案 0 :(得分:2)
在第一个示例中,AST转换添加了User creator
属性,在第二个示例中,它添加了Set createdBooks
属性。两者都被添加到字节码中,而不是元类,因此Java可以调用这些属性,这很重要,因为Hibernate对GORM一无所知,只能使用真实的方法和字段。
您可以设置您正在做的创建者,也可以直接添加到createdBooks
集合,但使用addTo
和removeFrom
方法可以做更多事情 - 他们会初始化该集合如果为null,并且还在Book类中设置了后向引用,以使内存尽可能接近保存后数据库中的内容。
编辑,基于更新的问题:
你可以做你所描述的大部分内容,但基本上没有理由因为你想要做的事情可以做到"正常"办法。你似乎没有Java / Groovy背景 - 我猜猜你因为你想要一切都是一个数组吗?这太棒了 - 你很快就会得到这个。但是,避免试图强迫你对代码应该如何工作的期望,除非你正在试验看什么有效,以及它什么时候会破坏,当你试图做那些事情时你不应该抱怨太多不要像在线参考文档那样。 addToBooks / removeFromBooks动态方法是您正在寻找的,但文档也提供了对大局的理解。
阅读the docs并获得一本或两本好的入门书籍。在grails.org的Books page中引用了几个。 " Grails 2:快速入门指南"是最容易上手的,而权威指南和Grails in Action也非常易读,但非常全面,首先介绍了Groovy并完成了所有核心功能。所有3个都有您可以在阅读时使用的示例应用程序。