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的属性C来xxs,它的工作原理:
class C {
static hasMany = [bbs: B, xxs: A]
}
Run Code Online (Sandbox Code Playgroud)
b然后先保存a.GORM似乎按字段的字典顺序级联保存(首先bbs,然后xxs)!
如何控制GORM用于保存级联的顺序(除了重命名字段,这对我来说似乎非常脆弱)?
据我所知,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)
注意:这两种方法都没有经过测试
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |