Grails 2.4 - 域建模

时间:2014-06-20 17:54:49

标签: grails

我正在使用Grails 2.4并使用提供REST API。我正在寻找有关域/实体创建的建议。

我有4个简单的表格:

1) projects:
   projectId (auto-increment, PK)
   name 
   description
   (some other fields but not important for my question I guess)

2) users:
   userId (auto-increment, PK)
   roleId (FK->roles/roleId)
   username 
   (some other fields but not important for my question I guess)

3) project_users (join table for projects & users):
   projectId FK->projects/projectId)
   userId (FK->users/userId)

4) roles:
   roleId (auto-increment, PK)
   name

角色可以是用户,经理或管理员。一个项目可以有很多用户(角色'用户'以及1个角色'经理')的多个用户。

此REST API(JSON)需求的使用者是项目的列表(GET),其中包含每个项目的所有用户名称(用户名不是userId)(所有用户......如果用户不是经理,则无关紧要)。他们还希望能够将新用户(PUT)添加到项目中。还要创建新项目(POST)。对于所有请求,JSON请求/响应应包含用户名)我真的在寻找有关如何继续的建议。

为了熟悉Grails / REST,我定义了3个域(项目,用户和角色)和GET&单独POST JSON到这些域正常工作(没有域关系完成)。

然后为了发挥域名关系,我尝试了db-reverse-engineer'插件,它给了以下域名的关系。

class Projects {
    String name
    String description
    static hasMany = [userses: Users]

    static mapping = {
        id column: "project_id"
        version false
    }

    static constraints = {
        name unique: true
        description nullable: true
    }
}

class Users {
    String username
    Roles roles
    static hasMany = [projectses: Projects]
    static belongsTo = [Roles]

    static mapping = {
        id column: "user_id"
        version false
    }

    static constraints = {
        username maxSize: 32, unique: true
    }
}


class Roles {
    String name
    static hasMany = [userses: Users]

    static mapping = {
        id column: "role_id", generator: "assigned"
        version false
    }
    static constraints = {
        name maxSize: 16, unique: true
    }
}

现在我不确定如何继续下去。我是否需要创建数据库视图(db不允许更新查看)&相应的控制器和保存写自定义代码。只有几天我和Grails& amp; REST,请耐心等待基本问题。

2 个答案:

答案 0 :(得分:0)

Grails开发的一般策略是一个简单的MVC模式,您可以使用控制器构建模型并将其传递给视图。对于REST API,您实际上不需要视图,除非您需要更改域对象的默认显示方式。您需要为请求配置一些映射,以便讨论REST API here。除此之外,如果您需要超出基本crud操作的任何业务逻辑,您只需要一个控制器和一个服务。至于你的域层,有几点建议:

1)通常有域类和数据库表是重要的,所以你不必拥有像用户这样的名字等等。所以我会让你的表用户,角色和项目。

2)您与用户和项目之间存在多对多关系,因此您需要指定该关系。您可以在映射中使用joinTable执行此操作,但如果您要查询关系很多,则可能需要为ProjectUser创建单独的域类,因为如果您不小心,则会遇到hibernate n + 1问题。

希望有所帮助,

答案 1 :(得分:0)

Grails默认使用Hibernate与您正在使用的任何数据库进行交互。它们与Hibernate的接口称为GORM(Grails对象关系映射)。这是一种将对象映射到数据库的强大方法,而不必使用数据库视图,存储过程等。默认情况下,Grails甚至会为您构建表格。基本的CRUD(创建,读取,更新和删除)操作正是Grails开箱即用的好处。我建议您阅读Grails user guide(特别是section on domain modeling),以便更好地了解Grails的优势。

注意:如果我听起来像一个shill,我将不分类地说Grails很不成熟并且肯定有缺陷。事实恰恰相反,快速简单的CRUD正是它擅长的。