使用grails建模复杂域模型

时间:2011-03-02 08:03:53

标签: web-applications grails grails-domain-class

我正在使用Grails构建Web应用程序,需要为复杂的组织结构建模。即。

  • 组织
  • 办公室

并检索层次结构各层次的人员列表。问题是Grails似乎没有很好的支持多态(没有接口等),这就是我通常会建模这样的结构。

你如何在Grails中为这样的结构建模?你知道有什么好的例子吗?

编辑:

关于接口JIRA并不是因为我没有看到GORM不能正确支持它们。参考指南仅提及与GORM相关的抽象类。

我正在寻找的东西就像Martin Fowlers Organizational Patterns。我需要从Heirarchy的任何级别获取GetPeople的方法,而不必明确地遍历结构,并且据我所知,GORM不能很好地支持这一点。

PS请证明我错了我会很高兴。

3 个答案:

答案 0 :(得分:2)

一个人可以有空或许多办公室,但通常是一个办公室。办公室在一个部门,部门在一个组织。在最简单的情况下,每个子级别都具有下一级别的类型属性,而下一级别具有子级别的对象列表。

class People{
   Office office 
}

class Office{
    static hasMany = [employee:People]
    Department department
}

class Department{
    static hasMany = [offices:Office]
    Organisation organisation
}

class Organisation{
    static hasMany = [departments:Department] 
}

如果您想知道哪个组织是一个人,您可以这样做:

def people = ...
def organisation = people.office.department.organisation

答案 1 :(得分:0)

对于抽象类,我实际上在GORM的域中使用它们。抽象类应该位于整个域文件夹之外。还要注意,正因为如此,GORM并没有对它们施加任何魔力。因此,如果您提供“static constaints = ...”或“static mapping = ...”等字段,则只要派生类不影响它们,就可以将它们考虑在内。还有一件事值得注意:域包之外的基类应该是抽象的。如果不是,GORM会抱怨它。

至于接口,我真的没有看到太多问题。您可以在域类上实现任意数量的接口。您不能声明使用接口作为其类型的字段,除非您提供有关其实际类型的提示(不完全确定这是可能的)。这是底层Hibernate堆栈的限制,并且直接影响它如何处理继承(即每个层次结构的表)。

但请记住,像Groovy REALLY 这样的动态语言使接口的用处更少。如果为所有域类提供一个具有通用名称的方法,则可以编写类似organisationStructureItem.findPeople()的内容,编译器不会抱怨它。在类似Java的强类型语言中不会出现这种情况。

答案 2 :(得分:0)

我认为Grails 2对抽象继承和多态查询的支持符合您的需求......参见http://grails.org/doc/2.0.0.M1/guide/GORM.html#inheritanceInGORM

的第5.2.3节