Я изо всех сил пытался создать правильные конфигурации для обеспечения поведения каскадного удаления в относительно простом проекте Grails.
Скажем, у меня есть следующие простые доменные классы:
class Author {
String name
static constraints = {
}
}
и
class Book {
String title
Author author
static constraints = {
}
}
Если я создаю автора, а затем создаю книгу, написанную этим автором, я не смогу удалить автора, не удалив сначала книгу вручную. Я получаю сообщение «Нарушение ограничения целостности». Это не удивительно, поскольку MySQL (моя базовая база данных) создается Grails с «ограничением внешнего ключа» для столбца «автор» таблицы «книга» как «Ограничить» (и это поведение согласуется с ожиданиями Grails документация как я понимаю).
Теперь, если бы мне пришлось вручную изменить базовое ограничение базы данных для столбца «автор» таблицы книги с «Ограничить» на «Каскад», я получил бы желаемое поведение. А именно, что если вы удалите автора, все его книги также будут удалены.
Итак, что я хотел бы сделать, так это изменить мой класс Grails «Book» таким образом, чтобы в столбце автора была создана таблица «book» с «каскадом удаления». Я читал много информации о таких вещах и о значениях по умолчанию GORM с использованием «ownTo» и явных «сопоставлений».
Один из способов сделать это, основанный на документации для "ownTo", казалось, состоял в том, чтобы изменить строку в классе Book с:
Author author
to
static belongsTo = [author: Author]
Таким образом, ясно указывается, что Автор является «стороной-владельцем» отношений. Документация, кажется, предполагает, что это должно вызвать поведение каскадного удаления, которое мне нужно. Однако это не сработает, если я не добавлю явное «hasMany = [books: Book]» в класс Author. Я не хочу этого делать. (Это желание имеет больше смысла в моей реальной сфере бизнеса, но даже как упражнение в понимании, я еще не понимаю, почему я должен явно знать о книгах в предметном классе Author).
Мне просто нужна настройка grails для изменения класса Book для создания настройки «каскадного удаления» в базе данных без изменения класса Author. Я пробовал использовать явное сопоставление, например:
static mapping = {
author cascade: 'all'
}
и комбинации этого с другим явным отображением или опциями «принадлежит к». Это не сработало.
Заметив, что простое изменение «ограничений» в базовой базе данных SQL обеспечивает желаемое поведение, есть ли способ добиться этого с помощью Grails? Если нет, то я неправильно понял здесь что-то фундаментальное или я пытаюсь сделать что-то глупое?