【问题标题】:grails unidirectional one-to-manygrails 单向一对多
【发布时间】:2010-10-26 09:51:56
【问题描述】:

这一直困扰着我,

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

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 = ?”)得到相同的结果。但我只是好奇,是否有更复杂的方法可以在 grails 中实现这一目标? (除了执行sql字符串)

【问题讨论】:

    标签: hibernate grails grails-orm


    【解决方案1】:

    您可以在 Category 类中添加以下几行

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

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

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

    那是您可以轻松地从 Product 进入 Category 并删除它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多