设计具有恒定圣杯的域的最佳方式



我的项目中有很多域类。其中许多都有类型列。例如:User表有userType列,Book表有bookType列。我经常通过调用BookType.list()方法将这些类型传递到 GSP g:select源中。但问题是,如果 GSP 包含大量g:select那么我必须执行大量冗余查询。

另一个问题是,当我创建一个新的域实例时,我必须通过以下方式从DB获取这些常量类型

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

在这里我也有同样的问题,我必须执行冗余查询。有没有好的设计可以在不执行这些冗余查询的情况下完成所有这些工作?

如果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, ...);

相关内容

  • 没有找到相关文章

最新更新