首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Grails 2.4 -领域建模

Grails 2.4 -领域建模
EN

Stack Overflow用户
提问于 2014-06-21 01:54:49
回答 2查看 193关注 0票数 1

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

我有4个简单的表格:

代码语言:javascript
运行
复制
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

角色可以是用户、经理或管理员。一个项目可以有多个用户(角色' user‘的多个用户和角色’manager‘的一个用户)。

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

为了熟悉Grails/REST,我定义了三个域(项目、用户和角色),并将JSON分别获取和发布到这些域中(不是域关系)。

然后玩领域关系,我尝试了‘db-反向工程’插件,它给出了以下领域的关系。

代码语言:javascript
运行
复制
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,所以请耐心接受我的基本问题。

EN

回答 2

Stack Overflow用户

发布于 2014-06-21 02:43:41

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

1)通常情况下,域类和DB表都是单数的,这样就可以避免使用用户名等名称。所以我会让你的表User,Role和Project。

2)您与您的用户和项目之间存在多对多关系,因此您需要指定这一点。您可以在映射中使用joinTable来实现这一点,但是如果您经常查询关系,则可能需要为ProjectUser创建一个单独的域类,因为如果您不小心,就会遇到hibernate n+1问题。

希望这能有所帮助,

票数 0
EN

Stack Overflow用户

发布于 2014-06-21 02:53:57

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

注意:如果我听起来像是一个shill,我将断然声明Grails是相当不成熟的,并且肯定有缺陷。它恰好是快速和简单的CRUD正是它所擅长的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24333046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档