我有一个 Java\Spring\Hibernate 应用程序 - 包含基本上是 Hibernate POJO 的域类

我认为 Grails 中可以很好地编写一个功能。

我希望重用我在主 Java 应用程序中创建的域类

最好的方法是什么?

我应该编写扩展 Java 类的新域类吗?这听起来很俗气,还是可以从Java域类中“生成”控制器?

在Grails Groovy中重复使用Java域对象的最佳实践是什么,我敢肯定,必须有其他人在Grails Groovy中写一些作品

如果您知道有关此类集成的教程,那就太棒了!

附:我是 grails-groovy 的新手,所以可能会错过明显的内容。谢谢 !!!

有帮助吗?

解决方案

您真的想要/需要使用 Grails 而不仅仅是 Groovy 吗?

Grails 确实不是可以用来向现有 Web 应用程序添加部件的东西。整个“约定优于配置”方法意味着您几乎必须遵守 Grails 的规则,否则使用它就没有意义。这些规则之一是域对象是由 Grails 运行时大力“增强”的 Groovy 类。

也许可以让它们扩展现有的 Java 类,但我不会打赌 - 并且现有应用程序的所有 Spring 和 Hibernate 部分都必须被丢弃,或者至少你必须花费大量的时间努力让它们在 Grails 中工作。您将与框架作斗争,而不是从中获利。

IMO你有两个选择:

  • 在 Grails 中从头开始重写您的应用程序,同时尽可能多地重用现有代码。
  • 保持应用程序原样并在 Groovy 中添加新内容,而不使用 Grails。

后者可能更适合您的情况。Grails 旨在快速创建新的 Web 应用程序,这就是它的亮点。向现有应用程序添加内容并不是它的初衷。

编辑:关于评论中的澄清:如果您打算为另一个应用程序使用的数据编写一个基本的数据输入/维护前端,并将数据库作为它们之间唯一的通信通道,那么这实际上可能与 Grails 配合得很好;当然可以将其配置为使用现有的数据库模式,而不是从域类创建自己的模式(尽管后者工作量较少)。

其他提示

了解 Groovy 和 Grails 在与现有 Java 代码集成方面的表现如何,我想我对您的选择可能比 Michael 更乐观一些。

首先,您已经在使用 Spring 和 Hibernate,并且由于您的域类已经是 POJO,因此它们应该很容易集成。您可能拥有的任何 Spring beans 都可以像往常一样在 XML 文件中指定(在 grails-app/conf/spring/resources.xml)或更简单地使用 Spring Bean 构建器 Grails 的功能。然后可以在任何控制器、视图、服务等中通过名称访问它们。并像往常一样工作。

据我所知,以下是用于集成域类和数据库模式的选项:

  • 绕过 GORM 并加载/保存您的域对象,就像您已经在做的那样。

    Grails 并不强迫您使用 GORM,因此这应该非常简单:创建一个 .jar Java 代码(如果还没有)并将其放入 Grails 应用程序的 lib 目录。如果您的 Java 项目是 Mavenized,那就更容易了:Grails 1.1 使用 Maven,因此您可以创建一个 pom.xml 为您的 Grails 应用程序添加 Java 项目作为依赖项,就像在任何其他 (Java) 项目中一样。

    无论哪种方式,你都能够 import 您的课程(以及任何支持课程)并照常进行。由于 Groovy 与 Java 的紧密集成,您将能够创建对象、从数据库加载它们、修改它们、保存它们、验证它们等。与您在 Java 项目中的操作完全一样。通过这种方式,您不会获得 GORM 的所有便利,但您将拥有以对您来说已经有意义的方式处理对象的优势(除了由于 Groovy 可能需要更少的代码)。您始终可以先尝试此选项以使某些功能正常工作,然后再考虑其他选项之一(如果当时看起来有意义)。

    如果您尝试此选项,有一个提示:将实际的持久性代码抽象为 Grails 服务(StorageService 也许)并让你的控制器调用它的方法而不是直接处理持久性。这样,如果需要,您可以将该服务替换为其他服务,并且只要您维护相同的接口,您的控制器就不会受到影响。

  • 创建新的 Grails 域类作为现有 Java 类的子类。

    如果您的类已经编写为正确的 bean,即,这可能非常简单。为其所有属性提供 getter/setter 方法。Grails 将看到这些继承的属性,就像它们是用更简单的 Groovy 风格编写的一样。您将能够指定如何验证每个属性,使用简单的验证检查(非 null、非空白等)或使用执行更复杂操作的闭包,可能调用 POJO 超类中的现有方法。

    您几乎肯定需要通过以下方式调整映射 GORM 映射 DSL 以适应现有数据库架构的实际情况。人际关系可能会变得棘手。例如,您可能有一些其他解决方案,其中 GORM 需要连接表,尽管甚至可能有一种方法可以解决此类差异。我建议您尽可能多地学习 GORM 及其映射 DSL,然后尝试您的一些课程,看看这是否是一个可行的选择。

  • 让 Grails 直接使用现有的 POJO 和 Hibernate 映射。

    我自己没有尝试过,但是根据 Grails 的说法 Hibernate 集成页面 这应该是可能的:“Grails 还允许您用 Java 编写域模型或重用已使用 Hibernate 映射的现有域模型。您所要做的就是将必要的“hibernate.cfg.xml”文件和相应的映射文件放置在“%PROJECT_HOME%/grails-app/conf/hibernate”目录中。您仍然可以调用 GORM 中允许的所有动态持久和查询方法!”

    例如,谷歌搜索“gorm Legacy”会出现许多有用的讨论和示例 这篇博文 作者:格伦·史密斯(即将发布的 Grails 的实际应用)其中他展示了一个用于与“来自地狱的遗留数据库”集成的 Hibernate 映射文件。 Grails 的实际应用 有一个章节名为“Advanced GORM Kungfu”,其中承诺详细讨论该主题。我有这本书的预发布 PDF,虽然我还没有读到那一章,但到目前为止我读到的内容非常好,而且这本书涵盖了其他 Grails 书籍中没有充分讨论的许多主题。

抱歉,我无法就最后一个选项提供任何个人经验,但它听起来确实可行(而且很有希望)。无论您选择哪个选项,请告诉我们结果如何!

这篇文章提供了一些使用grails for 在Web框架中包装现有Java类的建议

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top