在 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>

确保您为每个 Hibernate 映射文件添加一个<mapping>元素,并将这些映射文件放入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"
    ...
}

中添加以下内容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 社区中所有即将举行的活动。

查看全部