我正在使用Grails构建Web应用程序,需要为复杂的组织结构建模。即。
并检索层次结构各层次的人员列表。问题是Grails似乎没有很好的支持多态(没有接口等),这就是我通常会建模这样的结构。
你如何在Grails中为这样的结构建模?你知道有什么好的例子吗?
编辑:
关于接口JIRA并不是因为我没有看到GORM不能正确支持它们。参考指南仅提及与GORM相关的抽象类。
我正在寻找的东西就像Martin Fowlers Organizational Patterns。我需要从Heirarchy的任何级别获取GetPeople的方法,而不必明确地遍历结构,并且据我所知,GORM不能很好地支持这一点。
PS请证明我错了我会很高兴。答案 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节