使用 Grails 重用您的 Hibernate/JPA 域模型

工程 | Peter Ledbrook | 2010 年 8 月 26 日 | ...

这是一个常见的故事。您有一个现有的数据库,现在想要添加一个 Web 应用程序,并且尽可能简单。 Grails 能胜任这项任务吗? 当然可以! 更好的是,如果您已经有一个基于 JPA 或 Hibernate 配置文件的域模型,您可以重用它,并且仍然可以从您习惯的强大的 GORM 功能中受益。

重用现有域模型的第一步是将类文件放入应用程序的类路径中。 您可以通过将它们打包到 JAR 文件中并将其包含在应用程序中(通常是通过将其放入“lib”目录中),或者将源文件放入“src/java”目录中来实现这一点。 在应用程序之间共享模型时,JAR 文件是更好的方法,但是您需要一个多项目构建系统来确保 JAR 对于所有项目始终是最新的。 这可能值得付出额外的努力,并且 Gradle 和 Maven 都有用于构建 Grails 项目的插件。 或者,如果您的 Grails 应用程序是将来使用该模型的唯一项目,则应将源保存在“src/java”中。

一旦您决定如何合并域模型,您需要告诉 Grails 关于它的信息。 你如何做到这一点取决于你是否使用 Hibernate 配置文件或 JPA 注解。

XML 配置文件

Hibernate XML 映射文件很老派,但它们的优点是将所有映射信息保存在一个地方。 要从您的 Grails 应用程序中使用它们,只需创建文件grails-app/conf/hibernate/hibernate.cfg.xml内容如下

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <mapping resource="org.example.Book.hbm.xml"/>
        <mapping resource="org.example.Author.hbm.xml"/>
        ...
    </session-factory>
</hibernate-configuration>

确保您添加一个<mapping>为您的每个 Hibernate 映射文件添加元素,并将这些映射文件放入grails-app/conf/hibernate。 令人惊讶的是,这就是您必须做的全部! 那么带注释的模型呢?

JPA 注释

与 Hibernate 映射文件一样,您必须创建grails-app/conf/hibernate/hibernate.cfg.xml文件。 这次,您需要做更多的工作,因为您必须为每个域类添加一个<mapping>条目

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <mapping class="org.example.Book"/>
        <mapping class="org.example.Author"/>
        ...
    </session-factory>
</hibernate-configuration>

我承认这没什么乐趣,但至少你只需要做一次。

如果您使用的是 Grails 1.1.x 或更早版本,则需要执行一项额外的任务:您必须告诉 Grails 这是一个基于注解的模型,方法是将以下内容添加到grails-app/conf/DataSource.groovy:

dataSource {
    configClass = "org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration"
    ...
}

对于 Grails 1.2+,您无需执行此操作,因为GrailsAnnotationConfiguration是这些版本中的默认设置。 下次运行您的 Grails 应用程序时,您将可以访问所有带注释的域类。

注意 自 1.3.2 版本以来,您可以使用 Grails 命令create-hibernate-cfg-xml为您生成 Hibernate 配置文件。 节省打字/复制粘贴!

从 GORM 的角度来看,域模型中仍然存在一个明显的差距:约束。 您无法在 Java 类中定义它们,但如果没有它们,GORM 验证将毫无用处。 幸运的是,您可以通过添加一个package.DomainClassConstraints.groovy脚本到 'src/java' 来将约束元数据附加到类。 例如,如果您有一个域类org.example.LibraryBook,那么您应该添加文件src/java/org/example/LibraryBookConstraints.groovy。 在此脚本中,您可以像这样定义您的约束块

constraints = {
    name(blank: false)
    age(min: 0, max: 120)
    ...
}

您可能想知道为什么脚本会进入“src/java”目录。 这是一个好问题。 Grails 需要源代码形式的约束脚本,因此您需要将其放置在 Grails 包含.groovy文件(不是编译后的类)在 WAR 中的位置。“src/java”目录是唯一满足此要求的位置。

在您的 Grails 应用程序中合并 Java 域模型确实非常简单。 您可能会失去标准 GORM 域类的优雅和自定义映射,但您仍然可以使用动态查找器、条件查询、验证等。 那么脚手架呢? Grails 将尽力为您域模型构建脚手架,但不做任何保证。 只要模型简单,脚手架应该可以正常工作。 重用域模型也是尝试 Grails 的好方法,因为您不必从头开始创建一个。

请注意,如果您只想访问旧数据库并且没有现有的域模型,那么您几乎肯定最好使用带有自定义映射的标准 GORM 域类。 这两种方法都在用户指南中记录:Hibernate 映射自定义映射 DSL

最后一点:如果您在自己的 Grails 项目中使用过 Java 域模型,我很想听听您的经验。 任何可以帮助其他想要走这条路的用户的东西,我都会非常感谢!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

抢占先机

VMware 提供培训和认证,以加速您的进步。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部