【问题标题】:Deleting the object and its mapping in one-to-many in grails在grails中以一对多的方式删除对象及其映射
【发布时间】:2015-01-26 12:52:36
【问题描述】:

我有 2 个域类如下 -

class A {
   static hasMany = [B] // Just trying to show my mapping
}

class B {
   // This table doesn't belongs to A
}

现在我有一个 A 类的对象,其中包含一组对象 B。我想删除对象 A 及其与 B 的关联,但我不想删除对象 B。

我已经尝试级联删除、删除全部和删除全部孤儿,但它似乎试图从表 B 中删除相关记录,这不是我想要的。

这就是我现在正在做的-

objectTypeB.each { b ->
     a.removeFromB(b)
}

然后

a.delete()

但出现错误

deleted object would be re-saved by cascade (remove deleted object from associations)

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    您的示例几乎是正确的,我认为您需要告诉 A 将 B 存储在哪个集合中(参见 hasMany)

    class A {
        String name
        static hasMany = [b: B]
    }
    class B {
        String name
    }
    

    那么应该可以这样做(我在一个空白项目中尝试过,我的域也有一个字符串名称属性):

    def b1 = new B(name: 'b1').save(flush: true)
    def b2 = new B(name: 'b2').save(flush: true)
    def b3 = new B(name: 'b3').save(flush: true)
    
    def a = new A(name: 'a')
    a.addToB(b1)
    a.addToB(b2)
    a.save(flush: true)
    
    def x = A.get(1)
    
    println x.b
    
    x.delete(flush: true)
    assert A.count() == 0
    

    由于 B 与 A 之间没有关系,因此在删除 A 之前无需从 A 中删除 b。如果需要,我可以将代码片段发送给您

    【讨论】:

    • 嘿@sbglasius,我尝试了你的建议,但仍然收到此错误 - org.springframework.dao.InvalidDataAccessApiUsageException:已删除的对象将被级联重新保存(从关联中删除已删除的对象):
    • 另外,我的关联有 hasMany = [b: B],但为了简单起见,我没有展示它。你能把你的代码sn-p发给我吗?
    • 好的,按照你的例子我发现了这个问题。我正在使用 someOtherDomain.A.delete() 访问对象 A。在我使用 A.get() 之后一切正常。我错过了使用 get() 而不是从会话中访问。非常感谢您的帮助!!!
    猜你喜欢
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 2019-05-24
    • 2012-06-22
    相关资源
    最近更新 更多