Как предотвратить каскадное удаление для двунаправленных ассоциаций? - PullRequest
1 голос
/ 08 апреля 2011

Я хотел бы знать, возможно ли удалить родительские объекты в двунаправленной ассоциации 1: N без каскадного удаления. Согласно

http://grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20%28GORM%29.html

... в однонаправленных отношениях родительский конец отображается с помощью «save-update», а дочерний - с «none». Я пробовал эти настройки для двунаправленных отношений, но неудивительно, что они не сработали. В частности:

class Personnel {
    ...
}

static hasMany = [projectlead:Project, projectmanager:Project]

static mappedBy = [projectlead:'leaddeveloper', projectmanager:'projectmanager']

static mapping = {
    projectlead     cascade:'save-update'
    projectmanager  cascade:'save-update'
}

А вот класс проекта:

class Project {
    ...
}
static belongsTo = [leaddeveloper:Personnel, projectmanager:Personnel]

static mapping = {
    leaddeveloper   cascade:'none'
    projectmanager  cascade:'none'
}

Я бы предпочел не перепроектировать свое приложение (удалив «ownTo» из класса Project), если есть решение этого: навигационный доступ с обоих концов очень удобен, и у меня не слишком много экземпляров на окончание проекта.

Кроме того, если есть способ реализовать это, было бы интересно узнать, что происходит с этими активными отображениями впоследствии, могу ли я установить для них (или они будут установлены) значение "ноль", например?

Ценю любые материалы по этому вопросу.

1 Ответ

2 голосов
/ 13 апреля 2011

Читая ваш вопрос, я думаю, что вы хотите удалить объект "Personnel", но оставив его "projects" нетронутым. К сожалению, это не может быть сделано с вашей текущей реализацией. Отношение «belongsTo» означает, что каждый дочерний объект должен иметь родительский объект. Если вы удалите Родителя, сирота также будет удалена.

Еще один вариант, который вы можете попробовать, не внося слишком много изменений в дизайн, - это «пометить как удаленный». Добавьте «удаленное» поле в Personal, и, если вы хотите удалить кого-либо, просто пометьте его как удаленное. Это поможет вам сохранить исторические данные проектов даже после ухода менеджера проекта.

...