我是使用GRAG工具为GRAILS使用生成Domain类的新手,到目前为止,我必须对域进行大量编辑才能让它们与多对多关系一起工作,现在一切正常除了我似乎无法通过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都有值为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' 如果您需要更多信息,请告诉我。谢谢!
答案 0 :(得分:1)
我想出了我的问题,我试图这样做:
projectInstance.workers.add(workerInstance)
我应该做什么
projectInstance.addToWorkers(workerInstance)
我不知道groovy对此很挑剔,但我认为这是有道理的,我猜测addToXXX方法将域转换为可用/可保存的形式而不是Object。