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

时间:2015-02-25 17:02:59

标签: 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)

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

c.save()

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

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

现在技巧:如果我将aas的{​​{1}}属性重命名为C,则可行:

xxs
首先保存

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

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

2 个答案:

答案 0 :(得分: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()

2]为班级b

中的属性A定义custom cascading behavior
class A {
    static belongsTo = [c: C]
    B b

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

注意:两种方法都未经过测试

答案 1 :(得分:0)

在我的多对多中,我在尝试之前保存了C级.addTo'

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

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

我确实必须在某些情况下定义自定义级联行为。

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

https://spring.io/blog/2010/06/23/gorm-gotchas-part-1/

https://spring.io/blog/2010/07/02/gorm-gotchas-part-2/

https://spring.io/blog/2010/07/28/gorm-gotchas-part-3/

相关问题