Hibernate GORM级联保存的顺序取决于字段名?真正地

Hibernate GORM级联保存的顺序取决于字段名?真正地,hibernate,grails,gorm,cascade,Hibernate,Grails,Gorm,Cascade,我的课程安排如下: class A { static belongsTo = [c: C] B b } class B { static belongsTo = [c: C] } class C { static hasMany = [bbs: B, aas: A] } 如果我现在创建这些类的实例 B b = new B() A a = new A() a.b = b C c = new C() c.addToBbs(b) c.addToAas(a)

我的课程安排如下:

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

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


class C {
    static hasMany = [bbs: B, aas: A]
}
如果我现在创建这些类的实例

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

C c = new C()
c.addToBbs(b)
c.addToAas(a)
。。。试着拯救

c.save()
。。。我得到一个
org.hibernate.transientObject异常消息对象引用了一个未保存的临时实例-在刷新之前保存临时实例:B

我认为GORM所做的是首先将save级联到
c.aas
,然后它在实例
a.b
上绊倒,该实例尚未保存。因此,这是一个例外

现在诀窍:如果我将
C
aas
属性重命名为
xxs
,它会起作用:

class C {
    static hasMany = [bbs: B, xxs: A]
}
b
首先保存,然后
a
。GORM似乎按照字段的字典顺序级联保存(首先是
bbs
,然后是
xxs


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

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

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

1] 在保存
A
之前,显式保存
B
的实例(就像在没有
属性的单个关联中总是这样做一样)

2] 在类
A
中定义属性
b

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

    static mapping = {
        b cascade: 'save'
    }
}

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

在我的多对多方法中,我在尝试执行.addTo方法之前保存了C类

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

C c = new C()
c.save()
c.addToBbs(b)
c.addToAas(a)
在某些情况下,我必须定义自定义级联行为

这些文章有助于理解这样的问题


这可能无法回答您的确切问题,但这些保存是否包装在事务中?只要一切都是事务性的,我就希望你第一次尝试工作。是的。保存时有一个活动事务。抱歉,太早点击编辑按钮。如果使用“c.addToAas(a)”(不使用c.addToBbs(b)),它是否有效?我不确定保存是否会级联到第三级,但值得一试(我也有兴趣知道Gaurav关于“级联:保存”的建议是否有效,但我不认为它会有什么不同,因为hasMany的默认映射是“级联:所有”。)您好,正在尝试清理未回答的问题。你解决了这个问题吗?也许你可以回答你自己的问题。我没有解决它。可能根本就没有办法控制它。这对我来说是行不通的。没有A和B不能存储C。我知道GORM Gotcha的文章(你是对的,它们真的很好)。是的,首先要考虑的是保存的顺序,以及保存时级联的内容。与其将aas更改为xxs以按字母顺序保存,更好的解决方案是先找出必须保存的内容,然后按该顺序保存……这不是很方便用户,是吗??
B b = new B()
A a = new A()
a.b = b

C c = new C()
c.save()
c.addToBbs(b)
c.addToAas(a)