Это здесь для пользователей Grails. Я спросил об этом в списке рассылки grails - пользователей, но решил, что, поскольку я боролся с этим несколько дней, мне следует забросить как можно более широкую сеть.
Мне трудно смоделировать отношения между двумя объектами одного типа в другом объекте (другого типа), ссылаясь на эти два объекта.
В качестве примера того, что я пытаюсь сделать, предположим, что вы моделируете отношения между членами семьи. Любые отношения "принадлежат" двум разным членам семьи. Так:
class Person {
hasMany[relationships: Relationship]
static mappedBy = [relationships:'p1', relationships:'p2']
}
class Relationship {
Person p1
Person p2
String natureOfRelationship // for example, "cousins"
static belongsTo = [p1: Person, p2: Person]
}
Смысл здесь в том, что если удаляется либо p1, либо p2, то удаление будет происходить каскадно для всех объектов Relationship на карте hasMany. Вместо этого каждый раз, когда я пытаюсь это сделать, я получаю нарушение внешнего ключа. Я пробовал использовать атрибут «каскад», как описано в документации:
http://grails.org/doc/1.0.x/guide/single.html#5.5.2.9%20Custom%20Cascade%20Behaviour
Итак, я решил добавить это в класс Person:
static mapping = {
relationships cascade:'delete'
}
Мне и с этим не повезло.
Я также просмотрел файл devDB.script, который генерирует Grails, чтобы увидеть, как он настраивает внешние ключи в Relationship. Если я вручную добавлю «ON DELETE CASCADE» к обоим ограничениям внешнего ключа, тогда он будет работать нормально, но, очевидно, ручное редактирование автоматически сгенерированного сценария базы данных - не самое надежное решение. В идеале я хотел бы иметь возможность указать это поведение с помощью GORM.
Итак, что мне здесь лучше всего? Есть ли способ принудительного каскадного удаления нескольких внешних ключей / владельцев? Нужно ли мне делать это вручную с помощью действия onDelete для Person? Нужно ли мне для этого залезать в конфиги Hibernate или можно как-нибудь сделать это в Grails / GORM?
Большое спасибо за ваше время и за любую помощь, которую вы можете предложить.