Mysql 圣杯;GRAG,多对多关系未正确保存

Mysql 圣杯;GRAG,多对多关系未正确保存,mysql,grails,many-to-many,gorm,Mysql,Grails,Many To Many,Gorm,我不熟悉使用GRAG工具生成GRAILS使用的域类,到目前为止,我不得不大量编辑这些域,以使它们能够处理多对多关系,现在一切都正常了,只是我似乎无法通过Groovy在多对多关系中添加任何新的关系 我制作这个程序基本上是为了学习如何使用GRAG,因为将来我将在一个更大的数据库上使用它,数据库中有大量的关系。我在这方面已经努力了一段时间,但没有成功。所以我来找你 程序的快速描述: 域: 人 计划 任务 关系: 人: 有许多任务 他有很多项目 项目: 属于某人(出于某种原因,需要多对多,我不

我不熟悉使用GRAG工具生成GRAILS使用的域类,到目前为止,我不得不大量编辑这些域,以使它们能够处理多对多关系,现在一切都正常了,只是我似乎无法通过Groovy在多对多关系中添加任何新的关系

我制作这个程序基本上是为了学习如何使用GRAG,因为将来我将在一个更大的数据库上使用它,数据库中有大量的关系。我在这方面已经努力了一段时间,但没有成功。所以我来找你

程序的快速描述:

域:

  • 计划
  • 任务
关系:

人:

  • 有许多任务
  • 他有很多项目
项目:

  • 属于某人(出于某种原因,需要多对多,我不太明白)
  • 有很多人
任务:

  • 属于某人
我的问题是我想把人分配到项目中,直到我在项目模型上调用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都具有我预期的值,projectInstance的Worker甚至在保存之前添加了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'
如果你需要更多的信息,请告诉我。谢谢大家!

我解决了我的问题,我试着做:

projectInstance.workers.add(workerInstance)
当我应该做的时候

projectInstance.addToWorkers(workerInstance)

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

我解决了我的问题,我正在尝试:

projectInstance.workers.add(workerInstance)
当我应该做的时候

projectInstance.addToWorkers(workerInstance)

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

我找到了解决方法,但它是脏的。在addworker操作中,我可以再次连接到DB,并使用数据在分配表上进行插入。我不喜欢在我的程序中使用硬编码的SQL,当然有一种类似于Grails的方法可以做到这一点?你可以看看。我找到了一种解决方法,但它很肮脏。在addworker操作中,我可以再次连接到DB,并使用数据在分配表上进行插入。我不喜欢在我的程序中使用硬编码的SQL,当然有一种类似于Grails的方法可以做到这一点?你可以看看。