grails单向一对多

时间:2010-10-26 09:51:56

标签: hibernate grails gorm

这一直困扰着我,

假设我有两个型号,类别和产品

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

现在,我想删除碰巧存在于许多类别中的产品。我在删除方法之前在我的产品中提出了这些行

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

现在这可能有效,但我看到它的方式,这是一个简单任务的大量查询。我知道只用一行sql字符串就可以获得相同的结果(“从category_product中删除product_id =?”)。但我只是好奇,是否有更复杂的方式来实现这一目标? (除了执行sql字符串)

1 个答案:

答案 0 :(得分:1)

您可以将以下行添加到Category类

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

并在类别上调用delete。在这种情况下,为什么使用单向关系?用双向的不是更好吗?在上面的例子中,每次删除一个资源繁重的产品时,你都会遍历所有类别(当然,这取决于你的许多类别),更好的解决方案是通过像这样的双向关系找到类别。 :

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

那就是你可以轻松地从产品中获取类别并将其删除。

有关更多提示和提示,请参阅this blog post

相关问题