2017-05-17 8 views
0

내 프로젝트에는 많은 도메인 클래스가 있습니다. 그들 중 많은 사람들이 타입 컬럼을 가지고 있습니다. 예 : User 테이블에 userType 열이 있고 Book 테이블에 bookType 열이 있습니다. 자주 BookType.list() 메서드를 호출하여 GSP g:select 소스에 이러한 유형을 전달합니다. 하지만 문제는 GSP에 g:select이 많이 포함되어 있다면 많은 중복 쿼리를 실행해야한다는 것입니다.Grail에서 상수로 도메인을 설계하는 가장 좋은 방법은

그리고 나는 나는 또한 같은 문제가 방법은 다음

Book book = new Book(); 
book.bookType = BookType.findByName(BookTypes.COMICS); 

에 따라 DB에서 이러한 일정 유형을 얻을 수 있고, 새로운 도메인 인스턴스를 만들 때 또 다른 문제는, 내가 중복 쿼리를 실행해야합니다. 이러한 중복 쿼리를 실행하지 않고 이러한 모든 작업을 수행 할 수있는 좋은 디자인이 있습니까?

답변

1

types이 매우 휘발성이 아닌 경우 유형이 enum으로 정의 된 것을 볼 수 있으므로이 경우라고 가정합니다. enum을 사용해보십시오. 전적으로 말하지만, 데이터베이스 테이블을 백업 할 필요가 없습니다. 예를 들어,

enum SomeType { 

    TYPE1(1, "Type 1"), 
    TYPE2(2, "Type 2"), 
    TYPE3(3, "Type 3") 

    final int id 
    final String value 

    private SomeType(int id, String value) { 
     this.id = id 
     this.value = value 
    } 

    // Might be needed for <g:select> tags, I'm not very sure 
    int getKey() { id } 

    static SomeType byId(int id) { 
     values().find { it.id == id } 
    } 
} 

그런 다음, 도메인, 다음과 같은

class SomeDomain { 

    static constraints = { 
     ... 
     type nullable: false 
     ... 
    } 

    ... 
    SomeType type 
} 

을 무언가를, 당신은 단순히이 같은 뭔가를 할 수

SomeDomain book = new SomeDomain(..., type: SomeType.TYPE1, ...); 
+0

BookType.list을 (처리 방법)? –

+1

@EmdadulSawon : 대답은 이미 주어졌으며, 'byId (...)'메소드에 주목했습니다. 거기서 정의했습니다. 맞습니다. 'BookType.values ​​()'가 방법입니다. –