GORM级联保存取决于字段名称?真?

jac*_*uac 12 grails hibernate cascade grails-orm

我有以下安排的课程:

class A {
    static belongsTo = [c: C]
    B b
}

class B {
    static belongsTo = [c: C]
}


class C {
    static hasMany = [bbs: B, aas: A]
}
Run Code Online (Sandbox Code Playgroud)

如果我现在创建这些类的实例...

B b = new B()
A a = new A()
a.b = b

C c = new C()
c.addToBbs(b)
c.addToAas(a)
Run Code Online (Sandbox Code Playgroud)

...并尝试保存c ...

c.save()
Run Code Online (Sandbox Code Playgroud)

......我得到了org.hibernate.TransientObjectException Message object references an unsaved transient instance - save the transient instance before flushing: B.

我认为GORM所做的是首先将保存级联c.aas,然后它会绊倒a.b尚未保存的实例.因此例外.

现在的伎俩:如果我改名aas的属性Cxxs,它的工作原理:

class C {
    static hasMany = [bbs: B, xxs: A]
}
Run Code Online (Sandbox Code Playgroud)

b然后先保存a.GORM似乎按字段的字典顺序级联保存(首先bbs,然后xxs)!

如何控制GORM用于保存级联的顺序(除了重命名字段,这对我来说似乎非常脆弱)?

Gau*_*rav 0

据我所知,GORM 没有提供一种方法来控制将保存级联应用于属性的顺序。

我认为您应该能够通过使用以下方法之一来解决此问题:

1]B在保存之前显式保存实例A(就像对于没有 的单个关联所做的那样belongsTo

B b = new B().save()  
A a = new A(b: b)  // b should already be persisted as A doesn't `belongsTo` B
C c = new C()
c.addToBbs(b)
c.addToAas(a)
c.save()
Run Code Online (Sandbox Code Playgroud)

2]为类中的属性定义自定义级联行为bA

class A {
    static belongsTo = [c: C]
    B b

    static mapping = {
        b cascade: 'save'
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:这两种方法都没有经过测试