2016-10-11 2 views
0

나는 분명히 작동하기 때문에 내가 뭔가 잘못하고 있다고 확신한다. 간체 수업 :grails 2.5.1 removeFrom 이상한 동작 (제거하지 않음)을주는 일대 다

class Person { 
    String name 
    static hasMany = [cats:Cat] 
} 

class Cat { 
    String name 
    Person person 
    static belongsTo = Person 
    static constraints = { 
    person(nullable:false) 
    } 
    String toString() { 
    "${person.name}-${name}" 
    } 
} 

간단한 물건, 사람은 많은 고양이가 있고, 고양이는 단 한 사람에게만 속해야합니다.

는 지금은 서비스 클래스에 다음, 나는 이상한 결과를 얻을 않는 경우 :

delete(Cat cat) { 
    Person owner = cat.person 
    log.debug("Cats before removing ${cat} (id=${cat.id}): ${owner.cats} -- ${owner.cats*.id}") 
    owner.removeFromCats(cat); 
    log.debug("Removed from owner ${owner}, owner now has ${owner.cats} -- ${owner.cats*.id}") 
    log.debug("Cat to delete is now: ${cat} and belongs to... ${cat.person}") 
    cat.delete(flush:true) 
} 

을 그리고 오류 ", 개체가 다시 저장 될 저쩌구"이상한 비트

org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations) 

입니다 이다 디버그 결과, "밥"에 의해이 소유 고양이 "푹신한"을 제거하기 위해 전화했을 때 : 무슨 무슨

Cats before removing Bob-Fluffy (id=1356): [Bob-Fluffy] -- [1356] 
Removed from owner Bob, owner now has [null-Fluffy] -- [1356] 
Cat to delete is now: null-Fluffy and belongs to... null 

"removeFrom"실제로 컬렉션에서 개체를 제거하지 않습니다? 나는 청소하고 다시 컴파일했다. 왜 내가이 객체를 삭제할 수 없는지에 대한 손실이 꽤 큽니다.

답변

0

처럼 단지 belongsTo를 필드를 떠나려고 것은 cat.person 그것이 비록, 어떻게 든 오래된 점점 점이다 메서드의 첫 번째. cat.refresh()을 호출하면 작동하지 않지만 고양이로부터 추출한 후 owner.refresh()을 호출하면 작동하지 않습니다.

0

나는 사람이 사람과 현장 사람을 제거하고 그것은 내 경우에는 무슨 일이 일어 났는지처럼 보이는이

class Cat { 
    String name 
    static belongsTo = [person:Person] 
    static constraints = { 
    person(nullable:false) 
    } 
    String toString() { 
    "${person.name}-${name}" 
    } 
} 
+0

더 깨끗한 코드이지만 변경을해도 내 문제가 해결되지 않았습니다. – Trebla

+0

고양이를 지울 때 flush : true 옵션을 제거 할 수 있습니까? –

+0

거기에 행운이 없다 ... 삭제 단계를 성공적으로 통과했지만 트랜잭션이 플러시를 일으키는 다음 번에 같은 오류가 발생합니다. – Trebla

0

도메인 클래스를 이와 같이 변경합니다. 스키마 변경 때문에 도메인을 변경하면 서비스 클래스

delete(Cat cat) { 
    cat.delete(flush:true) 
} 

에서

class Person { 
    String name 
    static hasMany = [cats:Cat] 
} 

class Cat { 
    String name 
    Person person 
    // no need to add belongs to property here. it creates a join table that you may not need 
    static constraints = { 
    person(nullable:false) 
} 

String toString() { 
    "${person.name}-${name}" 
    } 
} 

는 새로운 데이터베이스로 시작합니다.

나는 당신의 문제를 해결해야한다고 생각합니다.

+0

나는 꼭 조인 테이블이 필요합니다 ... cat/person 패러다임은 어리 석으나 간단합니다. 예를 들어 모델. Cat은 Person의 일부가 아닌 이상 존재할 수 없습니다 (또는 오히려 그 사람의 일부가 아닌 경우 이해가되지 않습니다). 새로운 데이터베이스로 시작하는 것도 불가능합니다. 이는 수년간의 데이터가 포함 된 프로덕션 코드이기 때문입니다. – Trebla