Grails& GRAG,多对多的关系没有妥善保存

时间:2011-02-22 16:52:21

标签: mysql grails many-to-many gorm

我是使用GRAG工具为GRAILS使用生成Domain类的新手,到目前为止,我必须对域进行大量编辑才能让它们与多对多关系一起工作,现在一切正常除了我似乎无法通过Groovy在多对多关系中添加任何新的关系。

我基本上正在制作这个程序,以学习如何使用GRAG,因为我将来会在一个更大的数据库中使用它与大量的关系。我一直在嘲笑这一段时间并没有成功。所以我来找你。

程序的简要说明:

域:

  • 项目
  • 任务

关系:

人:

  • hasMany Tasks
  • hasMany Projects

项目:

  • 属于人(由于某种原因需要多对多,我不太明白)
  • hasMany Person

任务:

  • belongsTo Person

我的问题是我想将人员分配给项目,一切正常,直到我在项目模型上调用save()。

继承ProjectController中的addworker操作:

def addworker = {
    def projectInstance = Project.get(params.id)
    def workerInstance = Person.get(params.wid)
    if(projectInstance){
        if(workerInstance){
            workerInstance.save()
            projectInstance.workers.add(workerInstance)
            if(!projectInstance.save(flush:true)){
                flash.message ="WORKER ADDITION FAILED FOR WORKER ${workerInstance}"
            }else{
                flash.message ="Worker - ${workerInstance} - added."
            }
            redirect(action:"show", id:projectInstance.id)

        }else{
            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'person.label', default: 'Person'), params.wid])}"
            redirect(action: "list")
        }
    }else{
        flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'project.label', default: 'Project'), params.id])}"
        redirect(action: "list")
    }
}

当我运行动作时,我最终得到了一条flash消息,说它是“Worker - 1:TestWorker - added”,这是一个已经存在于数据库中的worker,并且在调试时,workerInstance和projectInstance都有值为I我希望,projectInstance的工作人员甚至可以在保存之前添加workerInstance。

无论出于何种原因,保存都不会保存工作人员列表。

这是项目域:

class Project {
static mapping = {
     table 'project'
     // version is set to false, because this isn't available by default for legacy databases
     version false
     columns{
         id column:'pro_id'
         proName column:'pro_name'
         proDesc column:'pro_desc'
         workers joinTable:[name:'assignment',key:'pro_id',column:'p_id'],lazy:false
     }
}
String proName
String proDesc
// Relation
static belongsTo = [Person]
static def hasMany = [workers: Person]


static constraints = {
    proName(size: 1..45, blank: false)
    proDesc(size: 0..255)
    workers()
}
String toString() {
    return "${id}: ${proName}"
}

}

虽然我可能不太明显我正在使用关系表,但它所持有的所有条目都是一个人的id和一个项目的id。 是否有一些特殊的东西要将新的密钥集添加到表中?我认为映射可以解决这个问题。

我正在运行一个mysql数据库,关系表名为'assignments' 如果您需要更多信息,请告诉我。谢谢!

1 个答案:

答案 0 :(得分:1)

我想出了我的问题,我试图这样做:

projectInstance.workers.add(workerInstance)

我应该做什么

projectInstance.addToWorkers(workerInstance)

我不知道groovy对此很挑剔,但我认为这是有道理的,我猜测addToXXX方法将域转换为可用/可保存的形式而不是Object。