Grails & GRAG, отношения многих ко многим не сохраняются должным образом - PullRequest
1 голос
/ 22 февраля 2011

Я новичок в использовании инструмента GRAG для генерации классов Доменов для использования GRAILS, поэтому мне пришлось довольно сильно редактировать домены, чтобы заставить их работать со многими отношениями, и теперь все работаетза исключением того, что я не могу добавить какие-либо новые отношения во многие ко многим через Groovy.

Я в основном делаю эту программу, чтобы научиться использовать GRAG, так как я буду использовать ее на гораздо большембаза данных в будущем с тоннами отношений.Некоторое время я ломал голову над этим и не имел успеха.Итак, я прихожу к вам.

Краткое описание программы:

Домены:

  • Персона
  • Проект
  • Задача

Отношения:

Человек:

  • hasMany Tasks
  • hasMany Projects

Project:

  • принадлежит человеку (необходим многим ко многим по некоторым причинам, я не совсем понимаю)
  • имеет много людей

Задача:

  • принадлежит человеку

Моя проблема в том, что я хочу назначить людей проектам, и все работает вплоть до вызова save () для модели проекта.

Вот действие addworker в ProjectController:

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}"
}

}

Хотя это может быть неочевидно, я использую реляционную таблицу, все записи, которые она хранит, - это идентификатор человека и идентификатор проекта.Что мне нужно сделать, чтобы добавить новые наборы ключей в таблицу?Я подумал, что сопоставление позаботится об этом.

Я использую базу данных MySQL, и реляционная таблица называется «назначения». Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.Спасибо!

1 Ответ

1 голос
/ 23 февраля 2011

Я выяснил свою проблему, я пытался сделать:

projectInstance.workers.add(workerInstance)

когда я должен был делать

projectInstance.addToWorkers(workerInstance)

Я не знал, что groovy требователен к этому, но я полагаю, что это имеет смысл, я предполагаю, что метод addToXXX преобразует Домен в пригодную для использования / сохраняемую форму вместо Объекта.

...