2010-07-16 5 views
2

이 문제가 발생합니다. 코드는 나에게 좋아 보이는 (분명 내가 뭔가를 놓친 거지. 문제는 그것이 무엇입니까?) Grails 계단식 동작

내가 프로젝트 클래스

def class project{ 
    ... 
    Manager manager 
} 

이것은 사람과 관리자 클래스 정의가

def class Person{ 
    String firstName 
    String lastName 
} 

def class Manager extends Person{ 
    static hasMany = [ projects: Project] 

} 

관계는 간단합니다. 프로젝트에는 관리자가 하나 있고 관리자에게는 많은 프로젝트가 있습니다. 내가 아는 한, 일대 다 관계에서 쌍방향 일대 다 (one-to-many)이기 때문에 저장 캐스케이드가 저장됩니다. org.hibernate.TransientObjectException : 나는 내가 다음과 같은 오류 에 의한 취득이

Project project = new Project() 
Manager mgr = new Manager(...) 
project.manager = mgr 
project.save() 

할 때 - 객체가 저장되지 않은 과도 인스턴스를 참조 세척하기 전에 transient 인스턴스를 저장 : 관리자

을 내가 할 때 이

Project project = new Project() 
Manager mgr = new Manager(...) 
project.manager = mgr 
project?.manager.save() 
project.save() 

잘 작동합니다. 하지만 프로젝트는? .manger.save()가 필요하지 않아야한다고 생각합니다 !!

답변

2

빠른 수정은 프로젝트를 저장하기 전에 관리자를 저장하는 것입니다.

또한 belongsTo 설정이 없습니다. grails 문서의 5 장을 확인하십시오.

http://grails.org/doc/latest/

"의 경우 양방향 일대 많은 측면은 다음 캐스케이드 전략 설정된다 belongsTo를 정의하지 않는 경우"SAVE 업데이트 "를 일측과"없음 " 많은 측을 위해. " 내가 올바르게를 얻을 경우

그래서, 당신은 양방향 액형의 경우

(일 계단식 얻을)를 MGR에 저장 (한쪽)하지만 프로젝트 측에 저장할 수 없습니다 호출 할 수 있습니다 대다수가 belongsTo를 정의하는 다 대다 (many to many). 그 다음, 계단식 전략은 한 쪽에서 "ALL"로 설정되고 많은면에서 "NONE"으로 설정됩니다.

또한 사용자 정의 계단식 동작을 지정할 수있는 5.5.2.9 절을 참조하십시오.

+0

답변 해 주셔서 감사합니다. 네 저축 매니저가 먼저 트릭을합니다. 그러나 belongsTo는 도움이되지 않습니다. 어떤 방법으로 올바른 작업을 수행 할 수 있습니까? i) 관리자 관리자를 제거하고 static belongsTo = [manager : Manager] 또는 정적 belongsTo = 관리자 인 ii) 관리자를 제거하고 정적 belongsTo = [manager : Manager] 또는 static belongsTo = Manager입니다. 나는 둘 다 시도했지만 작동하지 않습니다. 지금은 빠른 수정이 작동하고 있습니다 – Paras

+0

흠, 올바른 방법은 한쪽을 저장하는 것입니다. "많은면이 belongsTo를 정의하는 양방향 일대 다의 경우, 캐스케이드 전략은 한 쪽에서는"모두 "로, 다른면에서는"없음 "으로 설정됩니다." belongsTo를 사용해도 여러 단계에서 캐스케이드는 NONE입니다. 한 쪽이 아직 고집하지 않으면 많은면을 먼저 저장하는 것이 효과가 없습니다. 일반적으로 시스템에 관리자를 추가하고 저장 한 다음 프로젝트를 추가하기 때문에 이는 의미가 있다고 생각합니다. 나는 같은 일에 두 가지 일을 모두 할 수있는 경우를 볼 수 있었지만. – hvgotcodes