【问题标题】:Child class object can not delete子类对象不能删除
【发布时间】:2012-06-13 02:18:05
【问题描述】:

我有一些领域类 Incident、Problem、Category、Impact、Urgency 等。

Class Incident
{
   Category category
   String subject
   Impact impact
}

Class Problem
{
     Urgency urgency
     Category category
     String title
}
Class Category
{
    String categoryName
    String description
}

现在,一些行被插入到这个类中。现在,如果我要删除类别,它会引发错误,例如“grails 无法删除或更新父行”.. 那我该怎么做才能删除?

【问题讨论】:

    标签: grails grails-orm grails-domain-class grails-controller


    【解决方案1】:

    问题是 - 您在事件和问题类中引用了类别,因此这些类的数据库表将在类别表上具有外键,因此在删除这些事件/问题或更新这些事件/问题之前,您无法删除类别事件问题并将类别设置为空(您必须在域约束中将它们设为可空)

    所以要么你做

    Problem.executeUpdate('update Problem p set category = null where category = ?', [category])
    

    事件也一样

    或者您可以使用 belongsTo 和 hasMany 对您的域类建模,grails 会自动处理所有事情

    类似的东西

    class Problem {
        static belongsTo = [category:Category]
    }
    
    class Category {
      static hasMany = [
         problems: Problem
     ]
     static mappings = {
       problems cascade: "all-delete-orphan"
     }
    }
    

    我更喜欢使用 belongsTo、hasMany、hasOne 来管理关系,而不是仅仅使用引用,这样可以更好地表达模型。

    这也取决于您的领域模型,在您的业务中可能会出现问题,事件存在没有类别!或者它们必须属于某个类别。如果您的答案是第一个选项,您不想级联删除,而是使用 null 类别更新这些事件/问题,如果您的答案是第二个选项 - 您需要级联 all-delete-orphan

    【讨论】:

    • 如果我选择选项 2,那么在类别删除时,grails 将删除事件和问题记录!!!,所以这不是一个好主意...如果可能的话,其他解决方案,由 grails 和thanx 处理...苏迪尔
    • 如果它解决了您的问题 - 您可以接受答案。另外-您是否希望问题/事件存在没有类别或您想删除它们-我还不清楚。
    • 我希望问题和事件都在没有类别的情况下存在。
    • 如果在其中任何一个对象中使用了类别,则很难将其删除。
    • 你有我的问题吗?
    【解决方案2】:

    您的类别如何,是否属于事件域类,如果类别属于某个域类,则不能删除它。 参考:See here

    【讨论】:

    • 没有一个类别不属于那个......它的独立类被其他类引用。
    • 如果类别不属于任何人,删除应该没有问题,奇怪。你能显示类别的域类
    猜你喜欢
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2019-11-25
    • 2021-07-23
    • 2018-07-30
    • 2016-08-24
    相关资源
    最近更新 更多