我有以下类别安排:
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用于保存级联的序列(除了重命名字段,这对我来说似乎非常脆弱)?
答案 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/