(快速参考)

领域类用法

领域类实现了模型-视图-控制器 (MVC) 模式中的 M,它表示了一个持久实体,并映射到一个底层数据库表。在 Grails 中,域是在 grails-app/domain 目录中生存的类。领域类可以使用以下命令创建:create-domain-class

grails create-domain-class org.bookstore.Book

也可以使用你最喜欢的 IDE 或文本编辑器创建。

package org.bookstore

class Book {
    String title
    Date releaseDate
    Author author
}

默认情况下,类名被映射到大写和小写分隔符分隔的表名(不是驼峰式命名),因此,默认情况下名为 BookStore 的领域类将映射到名为 book_store 的表。每个属性都映射到单独的列。

默认的表命名方案的一个限制是,即使它们被定义在单独的包中,拥有两个名称相同的域类也是有问题的。例如,com.bookstore.BookStorecom.publishing.utility.BookStore 都将映射到名为 book_store 的表。如果在应用程序中定义了这两个类,可以通过使用不同的名称或为一个或两个类提供特定表名来管理此问题,该表名与默认表名不同(查看用户指南的 ORM DSL 部分,了解更多详情)。如果其中一个或两个域类由插件提供,应用程序作者可能无法使用这些选项。为了帮助管理这种情况,GORM 可以在默认情况下将插件名称作为表名的前缀。例如,如果 com.publishing.utility.BookStore 域类是由名为 PublishingUtilities 的插件提供的,默认表名可以是 publishing_utilities_book_store。要启用此行为,必须将 grails.gorm.table.prefix.enabled 配置属性设置为 true。示例

grails-app/conf/runtime.groovy
grails.gorm.table.prefix.enabled = true

请参阅 配置 部分,了解更多定义配置选项的详情。

请参阅用户指南中关于 GORM 的部分,了解更多信息。

Spring 自动装配域实例

从 Grails 3.2.8 开始,默认情况下已禁用 Spring 自动装配域实例,因为它会造成性能瓶颈。如果您正在将服务自动装配到域实例中,需要重新启用它。

对于 Grails 3.3.0 或更高版本,您可以在单个域类中启用自动装配

grails-app/domain/demo/Book.groovy
class Book {
    BookService bookService

    String name

   static mapping = {
       autowire true
   }
   ...
   ..
   .
}

您可以使用 默认映射 设置为所有域类启用自动装配

grails-app/conf/runtime.groovy
grails.gorm.default.mapping = {
        autowire true
}

对于低于 Grails 3.3.0 的版本,您可以通过更改 grails.gorm.autowire 配置参数来重新启用它。

grails-app/conf/application.yml
grails:
    gorm:
        autowire: true
如果启用了域实例的 Spring 自动装配,读取性能将下降。