2010-11-30 4 views
1

관련 엔티티를 삭제하고이 변경 사항을 데이터베이스에 유지하는 데 문제가 있습니다.grails/GORM/hibernate - 부모의 save()에 hasMany 맵이 동기화되지 않았습니다.

그루비 오브젝트 부모에는 많은 자식 엔티티가 있습니다. 이 도메인 객체를 찾고이 목록을 null로 설정하면 parent. save (flush : true) 자식 요소가 데이터베이스에 남아 있습니다. 이것들이 삭제 된 것을 기대했을 것입니다. 어떤 제안이라도 좋을 것입니다.

class Parent {

static hasMany = [child:Child] ... }

와 아이 :

class Child {

belongsTo = [Parent] ... }

우리는 요소를 추가 및 삭제 : 우리가 될 것이라고 잘못 무슨 짓을했는지에 대한

 
def child = new Child()

def parent = new Parent(child:child)

parent.save(flush:true) def id = parent.id //from saved entity

/// in separate transaction

parent = Parent.get(id) //id from above parent.child = null

parent.save(flush:true)

// check database - child reference still there - expect to have been deleted

어떤 제안 고맙습니다. grails 1.3.5 (최신 버전) 사용.

답변

4

우선, 당신은 child.delete (참 플러시)를 사용합니다. 그것은 단지 적당하지 않습니다. (이전 실수로 유감입니다)

나는 Peter Ledbrook 시리즈를 읽어 보시기 바랍니다 : http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/. 귀하의 경우, 검색 삭제 "어린이"

업데이트 : 경우에 당신은 여전히 ​​위의 문서 (특히 유용) 읽을 수 없습니다 :

아이를 삭제하려면를 먼저 한 후, 부모 모음에서 제거 할 필요 그것을 삭제하십시오. 하지만 그것은 belongsTo 관계를 사용하기 때문에 null 예외가 아닌 속성을 발생시킵니다.

솔루션 : 당신은 부모 클래스로이를 추가 할 수 있습니다

static mapping = { 
childs cascade: "all-delete-orphan" 
} 

위의 매핑이 부모가없는 모든 자식을 삭제하는 데 도움이됩니다. 그럼 당신은

parent.childs.clear() 
+1

아주 좋은 답변입니다. 블로그 읽기 - 그만한 가치가 있습니다! – sbglasius

+0

당신의 솔루션은 기본적으로 말한 것입니다. 나는 관련 문서를 지적했다. 한 남자에게 물고기를 주면 그는 하루 동안 먹고 남자에게 고기를 가르쳐 주며 일생 동안 먹는다 .... – hvgotcodes

+0

이러한 코멘트를 주셔서 감사합니다; 나는이 일을 할 수 없었고이 단계에서 조사를위한 더 많은 시간 예산을 가지고 있지 않습니다.계단식 "all-delete-orphan"및 "all, delete-orphan"설정 시도. 또한 각 항목을 삭제하고 clear를 호출 한 다음 새 행을 추가하려고 시도했지만 staleObject 예외를 저장합니다. 다시 조사 할 경우 logSql을 사용하여 최대 절전 모드의 작동 방식 및 디버깅 방법을 더 많이 이해할 수 있지만 기다려야합니다. 제공된 답변을 제공해 주셔서 감사합니다. – Alex

0
static mapping = 
{ 
    childs cascade: "all" 
} 

이 잘 작동 할 수 있습니다.

관련 문제