Grails在删除时调整_idx数据

时间:2012-12-11 19:58:38

标签: list grails gorm sequence

我们有这样的Domain类:

class Attribute {
  List attributeParameters = []
  static hasMany = [attributeParameters: AttributeParameter]
}

AttributeParameter属于Attribute。这里定义了几个其他关系,并且有一个实例,我们需要删除多个Attributes中的多个AttributeParameters。所以我们这样做:

def parameters = AttributeParameter.findAllBySomeOtherCriteria(foo)
parameters*.delete()

但是,有一个名为attribute_parameters_idx的attribute_parameter中的列不按顺序排列。此列存在是因为我们已将集合定义为List。如果我们对attribute.removeFromAttributeParameters(ap)这样做,Grails会自动调整此列。但由于我们没有以这种方式删除数据,因此它们不按顺序排列。

当发生这种情况时,我们在从Attribute中循环遍历集合时返回null值。这不是缓存问题或刷新父问题。当我们这样做时会发生什么:

attribute.attributeParameters.each { }

内部的东西是基于_idx值在迭代中添加其他行。由于缺少一行(或多行),Grails在Collection中添加了一个空行。调试时无法看到这一点,但您可以在迭代发生时观察它。

我的问题,最后是:

  • 有没有办法告诉Grails更新特定集合的_idx值,如果不是
  • 有没有办法获取此_idx列并通过Gorm手动修改其值

1 个答案:

答案 0 :(得分:0)

我认为这归结为Hibernate如何处理集合,尤其是像List这样的索引集合。不使用addToremoveFrom Hibernate不知道它需要更新索引。

作为一种解决方法,我可以想到这样的事情:

afterDelete课程中添加AttributeParameter个活动。在其中,你会想要像:

def afterDelete() {
    def sql = new Sql(dataSource)
    sql.execute("update attribute_attribute_parameter set attribute_parameter_idx = " +
    "attribute_parameter_idx - 1 where attribute_parameter_idx > " +
    "(select attribute_parameter_idx from attribute_attribute_parameter where " +
    "attribute_parameter_id = $id and attribute_id = $attribute.id) " +
    "and attribute_id = $attribute.id")
}

PS。尽管它是私有的,但我认为您可以使用getIndexColumnName()动态获取索引列名称。