grails一对多的关系

时间:2011-03-06 16:32:26

标签: java grails groovy

我是grails的新手,我需要你的帮助..

我有Author和Book域类:

class Author{

    static hasMany = [book:Book]

    String name
    //....
}

class Book{

    static belongsTo = [author:Author]

    String title
    //....
}

域类的控制器具有“新”操作,它创建新对象并保存在db中。 在我的浏览器中输入... / myApp / author / new?name = myName& ..., 在我的数据库中创建了作者对象,但是当我输入... / myApp / book / new?name = title& .. 它无法保存书籍对象,也许是因为我还没有作者对象......

在这种情况下我该怎么办? 如果有人知道解决方案,请帮助...

3 个答案:

答案 0 :(得分:4)

您需要传入要与Book实例关联的作者的ID。然后,您需要加载作者,并将其与您要保存的图书相关联。

我很确定你不能有一个名为'new'的控制器动作。 'new'是java / groovy中的保留关键字。

def blah = new Blah()

答案 1 :(得分:1)

定义图书belongsTo作者和作者hasMany图书时,如果没有作者,则无法创建图书。通常你应该做这样的事情:

  • 创建作者
  • 创建图书
  • 将书籍添加到作者
  • 保存作者 - >级联书籍自动保存。

当我看到你描述你的问题时,我认为你应该慢一点,看看Grails GORM(Groovy对象关系映射)的基础知识,你可以从“Getting started with Grails”的例子开始,或者阅读3 post about GORM Gotchas。它们非常易于理解。

答案 2 :(得分:0)

出于测试目的,您可以将一些数据加载到引导程序中:

class BootStrap {
  def init = { servletContext ->
    def writer = new Author(name:"Jane")
    writer.save()
    if(writer.hasErrors()){
       println writer.errors
    }
    def comic = new Book(name: "superman", Author: writer)
    comic.save()
    if(comic.hasErrors()){
       println comic.errors
    }
  }
def destroy = {}
}

这样你的应用就会有一个作者和一本书。

同样this tutorial对我很有帮助。