Грааль однонаправленный один-ко-многим - PullRequest
1 голос
/ 26 октября 2010

это меня беспокоило,

Допустим, у меня есть две модели, категории и продукта

class Category {
  static hasMany = [products : Product]
  String name
}
..
class Product {
  String name
}

Теперь я хочу удалить товар, который существует во многих категориях. я придумал эти строки в моем продукте до удаления методов

def beforeDelete = {
  Category.list()?.each{
       it.removeFromProducts(this)
    }
}

Теперь это может работать, но, как я понимаю, это большой запрос для одной простой задачи. я знаю, что могу получить тот же результат только с одной строкой строки SQL ("удалить из категории_продукта, где product_id =?"). но мне просто любопытно, есть ли более изощренный способ добиться этого в Grails? (кроме выполнения строки sql)

1 Ответ

1 голос
/ 29 октября 2010

Вы можете добавить следующие строки в класс Category

static mapping = {
    products cascade: "all-delete-orphan"
}

и вместо этого вызовите удаление в категории. Почему вы используете однонаправленное отношение в этом случае? Разве не было бы лучше с двунаправленным? В приведенном выше случае вы выполняете итерацию по всем категориям каждый раз, когда удаляете Продукт, который является ресурсоемкой операцией (конечно, в зависимости от того, сколько у вас категорий), лучшим решением было бы найти категорию с помощью двунаправленного отношения, например :

class Product {
    String name
    static belongsTo = [category: Category]
}

То есть вы легко могли попасть в категорию из продукта и удалить ее.

См. в этом блоге , где приведены дополнительные советы и подсказки.

...