2012-06-17 3 views
0

나는 두 개의 도메인 클래스의 여러 관계에 undirectional 하나 있습니다Grails GORM : 일대 다 관계에있는 아이의 속성을 'null'하는 법?

package net.peddn 

class User { 
    static hasMany = [texts: Text] 
    String username 
} 

package net.peddn 

class Text { 

    long creator 
    String title 

    static constraints = { 
     creator(nullable: true) 
    } 
} 

내 사용자 컨트롤러는 다음과 같습니다

package net.peddn 

class UserController { 

static scaffold = true 

    def delete() { 

     def userInstance = User.get(params.id) 

     userInstance.texts.each { text -> 
      text.creator = null 
     }   

     userInstance.delete(flush: true) 

} 

내 BootStrap.groovy의 모습 이 :

import net.peddn.Text 
import net.peddn.User 

class BootStrap { 

    def init = { servletContext -> 

    User user = new User(username: "username") 

    user.save(flush: true) 

    Text text1 = new Text(title: "titel 1", creator: user.id) 

    Text text2 = new Text(title: "titel 2", creator: user.id) 

    user.addToTexts(text1) 

    user.addToTexts(text2) 

    user.save(flush: true) 

    } 

    def destroy = { 
    } 

} 
지금 나는 다음과 같은 오류 얻을 내 사용자를 삭제하려고하면

는 : 내가 UserController.groovy에서

text.creator = 0 

에 코드를 변경하는 경우

| Server running. Browse to http://localhost:8080/usertexts 
| Error 2012-06-17 19:33:49,581 [http-bio-8080-exec-4] ERROR errors.GrailsExceptionResolver - IllegalArgumentException occurred when processing request: [POST] /usertexts/user/index - parameters: 
id: 1 
_action_delete: Löschen 
Stacktrace follows: 
Message: null 
    Line | Method 
->> 21 | doCall in net.peddn.UserController$_delete_closure1 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|  19 | delete in net.peddn.UserController 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 722 | run . . . in java.lang.Thread 

을 완벽하게 작동합니다.

By 덧붙여 : 나는 사용자가 삭제 될 때 Text 개체를 삭제하지 않기를 원하기 때문에이 도메인 모델을 사용했습니다. 하지만 누가 Text 객체를 만들 었는지 알고 싶습니다. 누군가이 문제에 대한 더 나은 해결책을 가지고 있다면 알려주십시오.

감사합니다. 당신이 양방향 관계 사용자 교과서하려면

def delete() { 

     def userInstance = User.get(params.id) 

     userInstance.texts.each { text -> 
      userInstance.removeFromTexts(text) 
     }   

     userInstance.delete(flush: true) 
    } 

당신은 사용자가 삭제 될 때이 동작을 변경할 수 있습니다 텍스트가 삭제되지 않도록하려면이 작동하는 경우 현재의 구현으로 피터

답변

0

시도하십시오 . 최대 절전 모드에서 캐스케이드 문서 섹션을 확인하십시오 : custom cascades. 다음과 같이 매핑을 변경할 수 있습니다.

class User { 
    static hasMany = [texts: Text] 

    static mapping = { 
     texts cascade: "save-update" 
    } 
} 
+0

ok ... 첫 번째 솔루션에서 동일한 예외가 발생했습니다. 다음 사용자 지정 계단식 사용하여 두 번째 솔루션을 시도했다. 나는 성공하기 전에 이것을 시도했다. – peddn

+0

'static belongsTo = [user : User]'와 양방향 관계를 선언하면 '참조 무결성 제약 위반'이 발생합니다. 그러나 이것을 으로 선언하면 'static belongsTo = User' 응용 프로그램이 예상되는 동작을 보여줍니다. 이게 정상입니까? 아니면 버그입니까? – peddn

+0

죄송합니다.'static belongsTo = User'라고해도 오류가납니다. 나는 Text 클래스에서 User 속성을 잊어 버렸다 :'User user'; 'static belongsTo = User'와 같은 오류가 발생했습니다 ... – peddn

0

마지막으로 오른쪽을 찾았습니다 hint. 이것이 캐스팅 문제 인 것 같습니다. 참조 :

Groovy Primitive Type Cast Gotcha When Upgrading to Grails 2.0

그래서 내가 "롱"의 "박스"버전으로 텍스트 도메인 클래스의 원시적 "긴"속성 변경 :

package net.peddn 

class Text { 

    Long creator 
    String title 

    static constraints = { 
     creator(nullable: true) 
    } 
} 

을 지금 속성을 설정할 수 있습니다 없는!

도움을 주신 Tomasz에게 감사드립니다.