2012-12-11 25 views
4

我們有一個域類,像這樣:Grails的要調整_idx數據卸下

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

AttributeParameter屬於一個Attribute。此處定義了其他幾種關係,並且存在一個實例,我們需要刪除多個Attributes中的多個AttributeParameters。因此,我們正在這樣做:

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

這樣的作品,然而,在attribute_parameter一列名爲attribute_parameters_idx是失控序列。此列存在是因爲我們已將該集合定義爲List。如果我們做到了attribute.removeFromAttributeParameters(ap),Grails會自動調整此列。但由於我們沒有以這種方式去除數據,所以它們失序。

當發生這種情況時,我們在從屬性循環集合時返回空值。這不是緩存問題或刷新父問題。當我們這樣做時會發生什麼:

attribute.attributeParameters.each { } 

內部東西在基於_idx值的迭代中增加額外的行。由於缺少一行(或多行),因此Grails會在集合中添加空行。在調試時你看不到這個,但你可以在迭代發生時看到它。

我的問題,最後是:

  • 有沒有辦法告訴Grails的,以特定集合更新_idx值,如果不
  • 有沒有辦法讓這個_idx列和修改它的值通過手動Gorm

回答

0

我認爲這取決於Hibernate如何處理集合,特別是索引的像List。不使用addToremoveFrom Hibernate不知道它需要更新索引。

作爲一種變通方法,我能想到的是這樣的:

AttributeParameter類添加afterDelete事件。其中,你會想要類似的東西:

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()來動態獲取索引列名稱。

+0

這是一個很好的方法。我想我們最終會放棄所有列表,然後回到帶有受控sequenceNumber列的集合。但這會暫時讓我們受益。謝謝。 – Gregg