我在Grails的类似这样的树结构:如何在一个步骤中保存“有根”的域类树?
class TreeNode {
String name
// more properties
List children = []
static hasMany = [children: TreeNode]
static belongsTo = [parent: TreeNode, root: TreeNode]
static mappedBy = [children:'parent']
static constraints = {
name(blank: false,maxsize: 100,)
parent(nullable:true)
root(nullable:false)
}
}
对于SQL性能方面的原因,我需要每个记录有一个直接引用它的根节点。因此,'根'属性。
在添加'root'之前,节点正确保存。也就是说,我可以在根节点上调用save(),并且parent_id字段在所有节点(除了根本身,其父ID仍然为空)之外被正确地分配。
我试图在beforeInsert()中通过向上走树直到找到父对象来指定'root'。
def beforeInsert = {
def node = this
while (node.parent) {
node = node.parent
}
root = node
}
我经常得到堆栈溢出异常。
at org.codehaus.groovy.grails.orm.hibernate.validation.HibernateDomainClassValidator.cascadeValidationToOne(HibernateDomainClassValidator.java:116)
at org.codehaus.groovy.grails.validation.GrailsDomainClassValidator.cascadeToAssociativeProperty(GrailsDomainClassValidator.java:142)
当堆栈溢出异常没有发生时,每个'root'引用它自己而不是最终根目录。 beforeInsert()不是爬树。
你能帮我解决这个问题吗? GORM是否会尝试先保存我的树结构?如果是这样,如果家长还没有被保存,它如何保存家长ID?最重要的是,如何通过在根节点上调用save()来保存树,这样可以正确设置“root”,而不必在save()之后立即更新所有节点?
顺便说一句,目前我正在使用Grails 1.3.7。 – 2012-07-31 22:21:21