领先一步
VMware 提供培训和认证,助您加速进步。
了解更多这是一个常见的故事。您已经有一个现有的数据库,现在希望以最简单的方式为它添加一个 Web 应用程序。Grails 能胜任这项任务吗?当然可以!更好的是,如果您已经拥有一个基于 JPA 或 Hibernate 配置文件构建的域模型,您可以重用它,并且仍然可以受益于您所熟悉的强大的 GORM 功能。
重用现有领域模型的第一步是获取应用程序类路径上的类文件。您可以通过将它们打包到 JAR 文件中并将其包含在应用程序中(通常是将其放入 'lib' 目录),或将源文件放入 'src/java' 目录来实现。当在应用程序之间共享模型时,JAR 文件是更好的方法,但这需要一个多项目构建系统来确保 JAR 对于所有项目始终是最新的。这可能值得付出额外的努力,而且 Gradle 和 Maven 都有用于构建 Grails 项目的插件。或者,如果您的 Grails 应用程序是唯一使用该模型的项目,则应将源保留在 'src/java' 中。
一旦您决定如何集成领域模型,就需要告诉 Grails。这取决于您是使用 Hibernate 配置文件还是 JPA 注释。
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。令人惊讶的是,您只需要做这些!那么关于注释模型呢?
与 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-app/conf/DataSource.groovy:
dataSource {
configClass = "org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsAnnotationConfiguration"
...
}
来告诉 Grails 这是一个基于注释的模型。对于 Grails 1.2+,您不必这样做,因为GrailsAnnotationConfiguration是这些版本的默认设置。下次运行您的 Grails 应用程序时,您将可以访问所有注释的域类。
注意 自 1.3.2 版本起,您就可以使用 Grails 命令create-hibernate-cfg-xml为您生成 Hibernate 配置文件。节省了输入/复制粘贴的功夫!
从 GORM 的角度来看,领域模型仍然存在一个明显的不足:约束。您不能在 Java 类中定义它们,但没有它们,GORM 验证就毫无用处。幸运的是,您可以通过在 'src/java' 中添加一个package.DomainClassConstraints.groovy脚本来将约束元数据附加到类。例如,如果您有一个领域类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' 目录是唯一满足此要求的地点。
将 Java 领域模型集成到 Grails 应用程序中确实非常简单。您可能会失去标准的 GORM 领域类的优雅和自定义映射,但您仍然可以使用动态查找器、条件查询、验证等。那么脚手架呢?Grails 会尽力为您生成领域模型的脚手架,但它不作任何保证。只要模型简单明了,脚手架就应该能正常工作。重用领域模型也是尝试 Grails 的好方法,因为您不必从头开始创建它。
请注意,如果您只想访问一个遗留数据库而没有现有的领域模型,那么使用带有自定义映射的标准 GORM 领域类几乎肯定更好。这两种方法都在用户指南中有记录:Hibernate 映射和自定义映射 DSL。
最后一点:如果您在自己的 Grails 项目中使用了 Java 领域模型,我很想听听您的经验。任何能帮助其他想走这条路的用户的事情都将不胜感激!