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方法將域轉換成一個可用/可保存的形式,而不是一個對象。