2013-06-03 7 views
0

Я просто столкнулся с странным поведением при удалении объекта из hasMany Связь в грабелях 2.2.1.Grails странный removeFrom * поведение

Стирание является не работает с:

def lessonInstance = Lesson.get(lessonId) 
long id = Long.valueOf(taskId) 
def task = Task.get(id) 
lessonInstance.removeFromTasks(task) 

При удалении работает с:

def lessonInstance = Lesson.get(lessonId) 
long id = Long.valueOf(taskId)  
def task = lessonInstance.tasks.find { it.id == id } 
lessonInstance.removeFromTasks(task) 

Я ожидал, как работать и я теперь интересно, почему последние работы и сначала не работает. Ниже приведены классы домена:

class Lesson{ 
    static hasMany = [tasks:Task] 
    static hasOne = [skill:Skill]  
     static constraints = { 
     tasks(nullable: false, minSize: 1) 
     skill(nullable: true) 
    } 
} 

class Task extends Artefact{ 

    Integer experiencePoints=0 

    Integer credits=0 

    static constraints = { 
     experiencePoints(blank: false, min: 0) 
     credits(blank: false, min: 0) 
    } 
} 

Спасибо!

+0

Похоже, что Grails не понимает, что 'Task', загруженный' get() 'и с' Lesson.tasks', является одним и тем же объектом. BTW Интересно, есть ли 'Task' или' Artefact' 'переопределены символы equals()/hashCode(). –

+0

Если 'Artefact' является объектом домена (таблица для стратегии подкласса), вы можете попробовать использовать' def task = Artefact.get (id) 'в первом случае. – dmahapatro

+0

Просто FYI - 'blank: false' ничего не делает для вас. –

ответ

0

Похоже, проблема может быть связана с различиями в кешировании между get и find. См. Ответ Берт Беквит для Difference between findAll, getAll and list in Grails.

... Я попытался воспроизвести проблему, используя консоль grails, но как найти, так и найти подходы, похоже, сработало.

Смежные вопросы