2012-11-19 3 views
0

groovy에서 런타임시 grails 클래스의 static mapping 섹션을 변경하는 방법이 있는지 궁금합니다. 현재 지금 내 도메인 클래스는 다음과 같습니다런타임에 도메인 클래스 매핑을 재정의하십시오.

class Result { 

    ObjectId id 

    String url 

    def Result(){ 

    } 

    void addObjectProperty(String key, value){ 
     this[key]=value 
    } 

    //No constrains defined yet. 
    static constraints = { 
    } 

    static mapWith="mongo" 

    static mapping = { 
     collection "results" 
     database "test" 
    } 
} 

지금 바로 할 수 있습니다 I가 런타임에 매핑 섹션을 변경하고자하는 말 : 내가 객체에 save()를 호출 할 때 지금은 저장

static mapping = { 
    collection "xyz" 
    database "mydb" 
} 

컬렉션 xyz에서 mydb의 결과. 나는 그루비 한 방식으로 저를 성취 할 수있는 방법이 있다고 생각하지만, 그루비에 익숙하지 않은 이래로 여기서 어려움을 겪고 있습니다 ... 누군가가 나를 올바른 방향으로 인도 할 수 있다면 좋을 것입니다.

고마워 ...이 일을 지혜에 대한 위 내 댓글

+1

가능하다하더라도 그렇게하지 않을 것입니다. 그냥 일어날 것을 기다리고 상처의 세계처럼 보인다. – Gregg

+0

그럼 뭐라고 제안 하시겠습니까? – evermean

+1

그것은 다시 매핑해야하는 이유에 따라 달라집니다. 필자는 모든 데이터를보다 영구적 인 방식으로 적용하지 않은 매핑을 변경해야하는 상황에 결코 빠지지 않았습니다. – Gregg

답변

2

참고. 즉, 런타임에 맵핑을 Groovy의 메타 캐스 기능으로 대체 할 수 있습니다. 당신은 당신이 원하는 때마다 다른 폐쇄 객체로 대체 자유롭게 이용할 수 있도록

Result.metaClass.'static'.mapping = { 
    collection "myCollection" 
    database "myDatabase" 
} 

는 Grails의에서 매핑 블록은 그루비 closure이다. Grails app 라이프 사이클에서 Hibernate를 설정하기 위해 매핑 클로저가 사용되는시기를 알지 못하기 때문에 예측할 수없는 Hibernate 부작용이 발생하거나 전혀 작동하지 않을 수 있습니다.

+0

그것은 매우 무섭다. 데이터베이스가 작동하더라도 데이터베이스 관계를 망칠 수 있습니다. 또한, 최소한 grails 애플리케이션이 시작될 때만 (디폴트로) 행해지 기 때문에 맵핑을 다시로드하도록 hibernate에게 알려야한다. – Anarchofascist

관련 문제