2012-12-11 2 views
4

우리는 도메인 클래스과 같이이 제거 _idx 조정하려면 Grails는 데이터가

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

AttributeParameter

Attribute에 속한다. 여기에 정의 된 몇 가지 다른 관계가 있으며 여러 속성에서 여러 AttributeParameters를 삭제해야하는 경우가 있습니다. 그래서 우리는이 일을하고 있습니다 : 작동

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

은, 그러나, 순서가 도착 attribute_parameters_idx라는 attribute_parameter의 열이 있습니다. 이 열은 컬렉션을 목록으로 정의했기 때문에 존재합니다. 그리고 우리가 attribute.removeFromAttributeParameters(ap) 일 경우, Grails는 자동으로이 열을 조정합니다. 그러나 우리는 데이터를 그런 방식으로 제거하지 않으므로 순서가 어긋납니다.

이 경우 속성에서 컬렉션을 반복 할 때 null 값이 반환됩니다. 캐시 문제가 아니거나 상위 문제를 새로 고치는 것입니다. 어떤 일이 발생합니까?

attribute.attributeParameters.each { } 

내부적으로 _idx 값에 기반한 반복에서 추가 행을 추가하는 중입니다. 그 행 중 하나 이상이 누락되어 있기 때문에 Grails는 Collection에 null 행을 추가합니다. 디버깅 할 때 이것을 볼 수는 없지만 반복이 일어나는대로 볼 수 있습니다.

는 마지막 질문입니다 내 :

  • 는 특정 모음에 대한 _idx 값을 업데이트하는 Grails에 알려줄 수있는 방법이 있나요 및
  • 하지 않을 경우이 _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

좋은 접근 방법입니다. 우리는 List를 모두 버리고 결국 제어 된 sequenceNumber 열을 가진 세트로 돌아갈 것이라고 생각합니다. 그러나 이것은 일시적으로 우리를 얻을 것입니다. 감사. – Gregg