2012-12-06 3 views
2

3 개의 정수로 구성되어 있지만 기본 키가없는 멋진 작은 도메인 클래스가 있습니다 (데이터베이스 디자인이 좋지 않기 때문에 ... 다시 쓰는 것이 문제가되지 않습니다) : 나는 foo는의 복합 ID를 사용하여 읽기 기능을 통해 플래그를 액세스하고 Grails, composite id가있는 도메인 클래스에서 read() 사용

Integer yayFlag = Domain.read(foo, bar).flag 

이 가장 좋은 방법은 이것에 대한 있는가

같은

로 바 할 수 원하는

class Domain implements Serializable { 

    Integer foo 
    Integer bar 
    Integer flag 

    static mapping = { 
     table 'domain' 
     version false 

     id composite: ['foo', 'bar'] 
     foo column: 'foo_nbr' 
     flag column: 'value_I_want_flag' 
     bar column: 'bar_nbr' 
    } 
} 

?

+0

id가 composite이고 해당 필드가 사용되지 않기 때문에'String id'를 제거해야합니다. –

답변

3

docs on this에 따르면, 당신은 프로토 타입 객체로 get() 구문을 통해 참조 할 수 있어야한다 : 그것은 또한 (아이디 구성 요소 필드를 사용하여) hashCode()equals()을 구현하고 만드는 조언 것을

def d = Domain.get(new Domain(foo: 23, bar: 999)) 

주 클래스 Serializable.

read()이 필요한 경우 해당 항목을 사용해 볼 수도 있지만 작동 여부를 알기 위해 소스를 검색하지 않았습니다. get()에 대한 참조 문서는 실제로 위와 같은 작업을 수행 할 수 있음을 실제로 보여주지는 않지만, 그래서 read() 참조 문서에서 결론적이지는 않습니다). Grails에서 잠시 떨어져 있었지만, get() 다음에 discard()을 시도해보고 DB 쓰기를 피할 수 있습니다.

+0

클래스를 컴파일하는 경우에도 직렬화 가능해야했습니다. 그리고 내가 DB를 덮어 쓰는 것이 얼마나 힘이 들었는지 읽었던 이유가 있습니다. 저는 매우 흥미로운 discard()에 대해 몰랐습니다! foo와 bar를 기반으로 새로운 인스턴스를 만드는 것에 기반하여 null이 아닌 아무것도 얻을 수 없었습니다. – PJT

+1

id compenents로 정의 된 equals() 및 hashcode()가 있습니까? 거기에 첫 번째 get()에서 문제가 될 것이라고 생각하지는 않지만이를 기반으로 인스턴스의 캐싱이 있다고 생각할 수 있습니다. –

+0

나는 hasCode()와 equals() 메소드를 가지고 있지 않다. – PJT

2

이렇게 할 수 없으므로 Brian이 언급 한대로 프로토 타입 인스턴스를 만들어야합니다. 당신은 당신이 당신을 위해 작업을 수행 사용할 구문 도우미 메서드를 만들 수 있습니다

static Domain read(int foo, int bar) { 
    read new Domain(foo: foo, bar: bar) 
} 

당신은 아마 너무 비슷한 get 방법을 원하는 것입니다.

+0

프로토 타입 인스턴스와 함께이 도우미 메서드를 만들고 읽기 및 시도도 함께 시도해 보았습니다. 나는 계속 null이되었다. 그래서 Domain.findWhere (foo : foo, bar : bar)를 사용하기로 결정한 다음 예상 결과를 얻었습니다. 읽기 위해 일할 수 있습니까? – PJT

+1

물론, 그렇지 않다면 대답을 제출하지 않았을 것입니다 :) –

관련 문제