2011-02-22 71 views
0

我是使用GRAG工具生成GRAILS使用的Domain类的新手,到目前为止我不得不编辑这些域以便让它们工作与多对多的关系,现在一切正常,除了我似乎无法通过Groovy在多对多关系中添加任何新关系。Grails&GRAG,多对多的关系没有妥善保存

我基本上是让这个程序学习如何使用GRAG,因为我将在一个更大的数据库中使用它,并且有很多关系。我一直在这一段时间里一直没有成功。所以我来找你。

程序的简单描述:

域:

  • 项目
  • 任务

关系:

人:

  • 的hasMany任务
  • 的hasMany项目

项目:

  • 属于关联人士(所需的许多一对多出于某种原因,我不太了解)
  • has许多人

任务:

  • 属于关联人

我的问题是我想派人项目和一切工作的权利,直到我打电话保存()在项目模型。

继承人在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") 
    } 
} 

当我跑我结束了我的闪光灯消息称它的行动“工人 - 1:TestWorker - 补充说:”这是一个已经存在的工人数据库,并且在调试时,workerInstance和projectInstance都具有我所期望的值,并且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' 如果您需要更多信息,请让我知道。谢谢!

+0

我发现了一个工作,但它很脏。 在addworker行为中,我可以再次连接到数据库,并在数据表上插入赋值表。我不喜欢在我的程序中使用硬编码的SQL,肯定有一种Grails式的方式来做到这一点? – Damon 2011-02-22 18:05:09

回答

0

我想通了,我的问题,我试图做的事:

projectInstance.workers.add(workerInstance) 

时,我应该已经做

projectInstance.addToWorkers(workerInstance) 

我不知道常规是挑剔的,但我猜想它是有道理的,我猜addToXXX方法将域转换成一个可用/可保存的形式,而不是一个对象。