Лучший способ создать домен с константой в граалях

У меня есть много классов домена в моем проекте. У многих из них есть тип столбца. Например: User стол имеет userType колонка, Book стол имеет bookType колонка. Я часто передаю эти типы в GSP g:select источник по телефону BookType.list() метод. Но проблема в том, что GSP содержит много g:select тогда я должен выполнить много лишних запросов.

И еще одна проблема, когда я создаю новый экземпляр домена, я должен получить эти типы констант из БД следующим образом

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

Здесь у меня тоже есть такая же проблема, я должен выполнить лишний запрос. Есть ли хороший дизайн, чтобы делать все эти вещи без выполнения этих избыточных запросов?

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, ...);
Другие вопросы по тегам