removeFrom * не работает и без ошибок - PullRequest
4 голосов
/ 21 января 2010

У меня есть простая проблема, но я не смог ее решить ... По какой-то причине у меня есть контроллер, который использует removeFrom * .save (), который не выдает ошибок, но ничего не делает.

Running Граальс 1.2 Linux / Ubuntu

Следующее приложение урезано, чтобы воспроизвести проблему ...

У меня есть два объекта домена через create-domain-class - Работа (которая имеет много заметок) - Примечание (которое принадлежит Иову)

У меня есть 3 контроллера через create-controller - JobController (работает эшафот) - NoteController (работает эшафот) - JSONNoteController

JSONNoteController имеет один основной метод deleteItem, который предназначен для удаления / удаления заметки.

Это делает следующее

  • проверка некоторых запросов
  • удаляет заметку из задания - jobInstance.removeFromNotes (noteInstance) .save ()
  • удаляет заметку - noteInstance.delete ()
  • возвращает состояние и оставшиеся данные, заданные в виде ответа json.

Когда я запускаю этот запрос - я не получаю ошибок, но похоже, что jobInstance.removeFromNotes (noteInstance) .save () ничего не делает и не выдает никаких исключений и т. Как я могу отследить почему ??

Я приложил пример приложения, которое добавляет некоторые данные через BootStrap.groovy. Просто запустите его - вы можете просматривать данные через стандартные представления лесов.

Если вы запускаете Linux, из командной строки вы можете запустить следующее GET "http://localhost:8080/gespm/JSONNote/deleteItem?job.id=1&note.id=2"

Вы можете запускать его снова и снова, и ничего не происходит. Вы также можете вставить URL-адрес в веб-браузер, если вы используете Windows.

Пожалуйста, помогите - я застрял !!! Код здесь текст ссылки

Примечание домен

package beachit

class Note
{

    Date dateCreated
    Date lastUpdated

    String note

    static belongsTo = Job

    static constraints =
    {
    }

    String toString()
    {
        return note
    }
}

Job Domain

package beachit

class Job
{

    Date dateCreated
    Date lastUpdated

    Date        createDate
    Date        startDate
    Date        completionDate

    List notes

    static hasMany = [notes : Note]

    static constraints =
    {
    }

    String toString()
    {
        return createDate.toString() + " " + startDate.toString();
    }
}

JSONNoteController

package beachit

import grails.converters.*
import java.text.*

class JSONNoteController
{

    def test = { render "foobar test"  }

    def index = { redirect(action:listAll,params:params) }

    // the delete, save and update actions only accept POST requests
    //static allowedMethods = [delete:'POST', save:'POST', update:'POST']

    def getListService =
    {
        def message
        def status
        def all = Note.list()

        return all
    }

    def getListByJobService(jobId)
    {
        def message
        def status

        def jobInstance = Job.get(jobId)
        def all

        if(jobInstance)
        {
            all = jobInstance.notes
        }
        else
        {
            log.debug("getListByJobService job not found for jobId " + jobId)
        }

        return all

    }

    def listAll =
    {
        def message
        def status
        def listView

        listView    = getListService()
        message     = "Done"
        status      = 0

        def response = ['message': message, 'status':status, 'list': listView]
        render response as JSON
    }

    def deleteItem =
    {
        def jobInstance
        def noteInstance
        def message
        def status
        def jobId = 0
        def noteId = 0
        def instance
        def listView
        def response

        try
        {
            jobId = Integer.parseInt(params.job?.id)
        }
        catch (NumberFormatException ex)
        {
            log.debug("deleteItem error in jobId " + params.job?.id)
            log.debug(ex.getMessage())
        }

        if (jobId && jobId > 0 )
        {
            jobInstance = Job.get(jobId)

            if(jobInstance)
            {
                if (jobInstance.notes)
                {
                    try
                    {
                        noteId = Integer.parseInt(params.note?.id)
                    }
                    catch (NumberFormatException ex)
                    {
                        log.debug("deleteItem error in noteId " + params.note?.id)
                        log.debug(ex.getMessage())
                    }

                    log.debug("note id =" + params.note.id)
                    if (noteId && noteId > 0 )
                    {
                        noteInstance = Note.get(noteId)
                        if (noteInstance)
                        {
                            try
                            {
                                jobInstance.removeFromNotes(noteInstance).save()
                                noteInstance.delete()

                                message = "note ${noteId} deleted"
                                status = 0
                            }
                            catch(org.springframework.dao.DataIntegrityViolationException e)
                            {
                                message = "Note ${noteId} could not be deleted - references to it exist"
                                status = 1
                            }
                            /*
                            catch(Exception e)
                            {
                                message = "Some New Error!!!"
                                status = 10
                            }
                            */
                        }
                        else
                        {
                            message = "Note not found with id ${noteId}"
                            status  = 2
                        }
                    }
                    else
                    {
                        message = "Couldn't recognise Note id : ${params.note?.id}"
                        status = 3
                    }
                }
                else
                {
                    message = "No Notes found for Job : ${jobId}"
                    status = 4
                }
            }
            else
            {
                message = "Job not found with id ${jobId}"
                status = 5
            }

            listView    = getListByJobService(jobId)

        } // if (jobId)
        else
        {
            message = "Couldn't recognise Job id : ${params.job?.id}"
            status = 6
        }

        response = ['message': message, 'status':status, 'list' : listView]
        render response as JSON

    } // deleteNote
}

Ответы [ 3 ]

5 голосов
/ 23 января 2010

У меня все получилось ... хотя я не могу объяснить, почему.

Я заменил следующую строку в deleteItem

noteInstance = Note.get(noteId)

со следующим

noteInstance = jobInstance.notes.find { it.id == noteId }

По какой-то причине jobInstance.removeFromNotes работает с объектом, возвращаемым этим методом вместо .get Что делает его странным, так это то, что все остальные функции gorm (на самом деле не совсем уверенные в динамических) работают с методом noteInstance.get (noteId).

По крайней мере, это работает, хотя !!

3 голосов
/ 26 сентября 2013

У меня только что возникла такая же проблема. Функция removeFrom выполнена успешно, сохранение выполнено успешно, но физическая запись в базе данных не была удалена. Вот что сработало для меня:

  class BasicProfile {
        static hasMany = [
                post:Post
        ]
    }

    class Post {
       static belongsTo = [basicProfile:BasicProfile]
    }

    class BasicProfileController {
        ...

def someFunction
    ...   
        BasicProfile profile = BasicProfile.findByUser(user)

           Post post = profile.post?.find{it.postType == command.postType && it.postStatus == command.postStatus}

       if (post) {
          profile.removeFromPost(post)
          post.delete()
       }
       profile.save()

    }

Таким образом, это была комбинация removeFrom с последующим удалением в связанном домене и затем сохранением в объекте домена.

3 голосов
/ 20 февраля 2011

Смотрите эту тему: http://grails.1312388.n4.nabble.com/GORM-doesn-t-inject-hashCode-and-equals-td1370512.html

Я бы порекомендовал использовать базовый класс для объектов вашего домена, например:

abstract class BaseDomain {

    @Override
    boolean equals(o) {
        if(this.is(o)) return true
        if(o == null) return false
        // hibernate creates dynamic subclasses, so 
        // checking o.class == class would fail most of the time
        if(!o.getClass().isAssignableFrom(getClass()) && 
            !getClass().isAssignableFrom(o.getClass())) return false

        if(ident() != null) {
            ident() == o.ident()
        } else {
            false
        }
    }

    @Override
    int hashCode() {
        ident()?.hashCode() ?: 0
    }

}

Таким образом, любые два объекта с одинаковым ненулевым идентификатором базы данных будут считаться равными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...