使用 grails 建模复杂的域模型 [关闭]

Posted

技术标签:

【中文标题】使用 grails 建模复杂的域模型 [关闭]【英文标题】:Modelling a complex domain model with grails [closed] 【发布时间】:2011-07-07 02:20:30 【问题描述】:

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

组织结构 部门 办公室 人

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

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

编辑:

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

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

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

【问题讨论】:

实际上,Grails 确实允许您在域类中使用接口和继承。您指的是哪些其他类型的支持?您希望在这些类中拥有哪些通用接口?我没有看到一个——除此之外,他们每个人都“有一个地址”。 您实际上是否有使用带有抽象基类和接口的 GORM 的经验,因为从我在 google 上找到的内容以及尝试亲自实现它们,GORM 不能正确处理它们。通过阅读文档的字里行间,我会惊讶地发现开发人员认为接口和抽象类很重要。 我确实有一定的 Grails 经验,虽然不是我对你投了反对票,但我可以猜到。首先,您的问题不够具体 - 1)您花了很长时间才提到“组织结构”和 2)特定任务(“从层次结构中的任何级别获取人员”),仍然 3)您没有t 描述你的类的关系。如果人们想要一个深刻的答案,他们确实会花时间来描述这样的事情。一个更好的问题是“我有这样一个类模型(描述或图表),我需要做这样的查询/更新:(样本)”。 【参考方案1】:

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

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

【讨论】:

这并没有真正涵盖我正在寻找的内容,因为任何标准的组织结构都需要某种接口或抽象基类,请参阅编辑。【参考方案2】:

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

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

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

【讨论】:

我非常喜欢能够正常工作的软件工程工具,但很遗憾,这是 Grails 不支持的领域。仅仅因为你可以并不意味着你应该使用动态语言的魔力。【参考方案3】:

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

【讨论】:

以上是关于使用 grails 建模复杂的域模型 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何修复 Grails 错误:“找不到名称 PrivacyOptions 的域类。请重试并输入有效的域类名称”

Grails 域模型中的继承导致重复的外键

在自己的域上进行 Grails 验证

如何使用用户定义的函数为 grails 中的域类变量设置默认值

Grails,Field 的域类默认值

在 grails 中获取分离的域实体