-6

我正在使用 Grails 构建一个 Web 应用程序,并且需要对复杂的组织结构进行建模。IE

  • 组织
  • 部门
  • 办公室
  • 人们

并检索每个层次结构级别的人员列表。问题是 Grails 似乎对多态性(没有接口等)没有很好的支持,这就是我通常会如何对这样的结构进行建模。

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

编辑:

关于接口JIRA,并不是说它不是我读到的 GORM 还没有正确支持它们。并且参考指南只提到了与 GORM 相关的抽象类。

我正在寻找类似 Martin Fowlers 组织模式的东西。我需要一种从层次结构中的任何级别获取人员的方法,而无需显式遍历结构,据我所知,GORM 并不能很好地支持这一点。

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

4

3 回答 3

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
于 2011-03-02T09:24:24.873 回答
0

至于抽象类,我实际上已经在 GORM 的领域中使用过它们。抽象类应该位于整个域文件夹之外。另请注意,正因为如此,GORM 不会对它们执行任何魔法。因此,如果您提供诸如“static constaints = ...”或“static mapping = ...”之类的字段,只要派生类不影响它们,它们可能会被考虑在内。还有一点值得注意:域包之外的基类应该是抽象的。如果不是,GORM 会抱怨。

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

但是请记住,诸如 Groovy 之类的动态语言确实使接口的用处大大降低。如果您为所有域类提供一个具有通用名称的方法,您将能够编写诸如 organizationStructureItem.findPeople() 之类的东西,并且编译器不会抱怨它。在 Java 这样的强类型语言中,情况并非如此。

于 2011-03-08T22:36:59.297 回答
0

我认为 Grails 2 对抽象继承和多态查询的支持可以满足您的需求......请参阅http://grails.org/doc/2.0.0.M1/guide/GORM.html#inheritanceInGORM的第 5.2.3 节

于 2011-07-30T18:16:47.030 回答