4

我们有一个像这样的域类:

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

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

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

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

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

attribute.attributeParameters.each { }

内部的一些东西是根据 _idx 值在迭代中添加额外的行。由于缺少这些行中的一个(或多个),Grails 将在集合中添加一个空行。调试时看不到这一点,但可以在迭代发生时观察它。

最后,我的问题是:

  • 有没有办法告诉 Grails 更新特定集合的 _idx 值,如果没有
  • 有没有办法获得这个 _idx 列并通过 Gorm 手动修改它的值
4

1 回答 1

0

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

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

在您的班级中添加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()来动态获取索引列名。

于 2012-12-11T21:13:02.400 回答