【问题标题】:Grails 2.4 - domain modellingGrails 2.4 - 领域建模
【发布时间】:2014-06-20 17:54:49
【问题描述】:

我正在使用 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 和 REST 几天,所以请耐心等待我的基本问题。

【问题讨论】:

    标签: grails


    【解决方案1】:

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

    1) 域类和数据库表通常是单数的,因此您可以避免使用用户等名称。所以我会让你的表用户、角色和项目。

    2) 您与您的用户和项目之间存在多对多关系,因此您需要指定这一点。您可以在映射中使用 joinTable 执行此操作,但如果您经常查询关系,您可能希望为 ProjectUser 创建一个单独的域类,因为如果您不小心,您将遇到休眠 n+1 问题。

    希望对你有帮助,

    【讨论】:

      【解决方案2】:

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

      注意:如果我听起来像个骗子,我会直截了当地说 Grails 还很不成熟,肯定有缺陷。恰巧,快速简单的 CRUD 正是它所擅长的。

      【讨论】:

        猜你喜欢
        • 2014-02-24
        • 2011-04-19
        • 1970-01-01
        • 2011-04-03
        • 2011-12-23
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 2019-07-19
        相关资源
        最近更新 更多