4

내지도에 대한 제약/DB 매핑을 조정 방법 : Grails의 도메인 클래스에 따라 Grails의 도메인 클래스

class MyClass { 
    Map myMap 
} 

지금에는 myMap를 들어, Grails는 자동으로지도의 요소에 대한 새 테이블을 만듭니다. 그러나 너무 긴 요소 (예 : 1,024 자)를 추가하면 DB 오류가 발생합니다.

어떻게하면 myMap의 테이블에있는 각각의 열을 더 큰 문자열을 허용 할 정도로 크게 만들 수 있을까요? 아니면 DB에서 수동으로해야합니까?

는 이미 (이 maxSize는지도 자체에지도의 값을 참조하고 안 때문에 예상대로) 작동하지 않는
static constraints = { 
    myMap(maxSize:1024) 
} 

을 시도했다.

그렇지 않은 경우 제약 조건을 통해, 어쩌면

static mapping { ... } 

를 통해 그것을 할 수있는 방법이?

답변

5

내가 성공적으로 사용한 다른 방법은지도를 공동 작업자 도메인 클래스의 컬렉션으로 푸시하는 것이 었습니다.

class DynaProperty { 
    String name 
    String value 

    static belongsTo = MyClass 
    static constraints = { 
     value(maxSize:4000) //Or whatever number is appropriate 
    } 
} 

그리고 MyClass의에서

:

class MyClass { 
    static hasMany = [dynaProperties:DynaProperty] 
} 

이 거의지도 이며, 그것은 당신에게 개별 항목을 끌어 동적 파인더를 사용할 수있는 기능을 제공합니다.

+0

고마워, 내가 마침내 그렇게했다. setter를 덮어 쓰려고 했으므로 Map을 매개 변수로 직접 전달할 수는 있지만 작동하지 않습니다. 예 : public void setdynaProperties (map map) {map.each {this.addToDynaProperties (name : it.key.toString(), value : it.value.toString())}}. 적어도 생성자를 사용하면 작동하지 않습니다. –

+0

멋지 네요, 전체 솔루션이 잘 작동했기 때문에 기쁩니다. 나는 그 오류가 당신의 세터와 어떤 관계가 있었는지 궁금합니다. 필자는 형식화 된 메서드 서명을 사용하여 속성을 "가짜"로 만들려고하는 데 문제가 있다는 것을 알고 있으며 "공용"대신 "def"를 사용하면 작동하는 경향이 있다는 것을 알고 있습니다. 그러나 그것은 setter보다 getter에 더 많이 적용될 수 있습니다. –

0

수행하려는 작업은 무엇입니까? 지도에 항상 같은 수의 물건이 있습니까? 클래스에 해당 속성을 정의해야합니다.

현재 접근법의 문제점을 볼 수 있습니다. 런타임까지지도에 무엇이 있는지 알아낼 방법이 없으므로 Grails가 어떻게 그것의 열을 만들 수 있습니까? 임은 놀랍게도 그것으로 시작했다 ...

+2

실제로 맵은 잘 지원됩니다. 키는 문자열이어야합니다. 그러나 나는 당신이 기본 하이버 네이트 설정 파일을 수정하여 맵을 위해 생성 된 테이블을 조정할 필요가 있다고 생각한다. http://grails.org/doc/latest/guide/5.%20Object%20Relational%20Mapping%20(GORM).html#5.2.4%20Sets%2C%20Lists%20and%20Maps (섹션 5.2. 4 세트, 목록 및지도 - 링크를 올바르게 가져 오는 데 어려움이 있습니다.). –