Каскадное поведение Грааля - PullRequest
2 голосов
/ 17 июля 2010

Я застрял в этой проблеме. Код выглядит нормально для меня (очевидно, я что-то упускаю. Вопрос в том, что это?)

У меня есть проект класса

def class project{
    ...
    Manager manager
 }

Это определение класса Person и Manager

def class Person{
   String firstName
   String lastName
}

def class Manager extends Person{
   static hasMany = [ projects: Project]

}

Отношения просты - у Проекта есть один менеджер, а у менеджера много проектов. Насколько я знаю, в отношениях «один ко многим» каскады спасения касаются, потому что это двунаправленное отношение «один ко многим». Но когда я делаю это

Project project = new Project()
Manager mgr = new Manager(...)
project.manager = mgr
project.save()

Я получаю следующую ошибку Вызывается: org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр - сохраните этот временный экземпляр перед сбросом: Manager

и когда я делаю это

Project project = new Project()
Manager mgr = new Manager(...)
project.manager = mgr
project?.manager.save()
project.save()

Работает просто отлично. Но я думаю, что проект? .Manger.save () не должен быть обязательным !!

1 Ответ

2 голосов
/ 17 июля 2010

Быстрое решение проблемы - сохранить менеджера перед сохранением проекта.

У вас также нет настроек «принадлежат».Ознакомьтесь с главой 5 документации Grails.

http://grails.org/doc/latest/

"В случае двунаправленной связи один-ко-многим, когда сторона с множеством не определяет принадлежность, то каскадная стратегияустановите «SAVE-UPDATE» для одной стороны и «NONE» для многих. »

Итак, если я правильно понял, вы можете вызвать save на mgr (одна сторона), но не сохранитьна стороне проекта (чтобы каскадирование работало)

В случае двунаправленной связи «один ко многим», когда сторона «много» определяет «принадлежат», тогда для каскадной стратегии устанавливается «ВСЕ» для одной стороны и«NONE» для многих сторон.

Вы также можете обратиться к разделу 5.5.2.9, где вы можете указать собственное каскадное поведение.

...