【问题标题】:Best way to design Domain with constant in grails在 grails 中使用常量设计域的最佳方法
【发布时间】:2017-10-16 08:29:41
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: database grails grails-orm domain-object


    【解决方案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, ...);
    

    【讨论】:

    • 如何处理 BookType.list() ?
    • @EmdadulSawon:答案已经给出,注意byId(...) 方法,我在那里定义。你是对的,BookType.values() 是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2011-11-27
    • 2012-02-06
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多