JHipster 领域语言 (JDL) - 入门指南

概要

在此页面中,您将了解JDL以及如何创建应用程序及其相关的所有内容。

  1. 生成内容
    1. 使用文件
    2. 使用单行JDL
  2. 生成应用
  3. 生成实体
  4. 生成属性
  5. 枚举
  6. 关联关系
  7. 选项
  8. 部署
  9. 常量
  10. 导出JDL

生成内容

使用文件

您可以使用JDL文件生成实体,过程如下:

  • 创建扩展名为“ .jh”或“ .jdl”的文件,
  • 声明您的应用程序,部署,实体和关系,或者使用 JDL-StudioJHipster IDE创建和下载文件,
  • 如果仅创建实体,则在JHipster应用程序的根文件夹中运行jhipster jdl my_file.jdl
  • 如果要创建应用程序,请在文件夹中运行“ jhipster jdl my_file.jdl”。

至此,大功告成!

如果您在团队中工作,也许你有多个文件而不是一个文件。 我们添加了此选项,以便您不必手动将所有文件连接为一个文件,而只要运行:

jhipster jdl my_file1.jdl my_file2.jdl

如果您不想在导入JDL时重新生成实体,则可以使用--json-only标志来跳过实体创建部分,仅在.jhipster文件夹中创建json文件。

jhipster jdl ./my-jdl-file.jdl --json-only

默认情况下,jdl仅重新生成已更改的实体。如果您希望重新生成所有实体,然后传递--force标志。 请注意,这将覆盖您对实体文件的所有本地更改:

jhipster jdl ./my-jdl-file.jdl --force

如果要在项目中使用它,可以通过执行以下操作来添加它:

  • NPM: npm install jhipster-core --save
  • Yarn: yarn add jhipster-core

在本地安装,并将其保存在您的package.json 文件中。


使用单行JDL

生成代码的另一种方法是在CLI中传递JDL代码,方法是: jhipster jdl --inline "application { config { baseName jhipster, applicationType microservice } }".

生成实体时,这种生成代码的方式特别有用。


现在,我们将从一个小的JDL内容开始,以了解生成内容的各种方法。 其他部分将对语法进行说明,但此处将重点介绍生成器。

这是我们将使用的基本内容:

application {
  config {
    baseName jhipster
    applicationType microservice
  }
}

这是一个非常基本的微服务应用程序,名为“ jhipster”,我们将看到从该示例生成应用程序的各种方法。

您将看到,通过这个小示例,您已经成功地从头创建了一个应用程序。


使用远程JDL文件

您也可以在jdl命令中使用URL。 只需传递URL而不是文件名,如下所示

jhipster jdl https://my-site.com/my.jdl


jhipster jdl https://gist.githubusercontent.com/user/id/raw/id/myapp.jdl

您还可以仅通过指定文件名从我们的[JDL示例仓库](https://github.com/jhipster/jdl-samples)获取远程JDL文件,我们将自动解析URL。

jhipster jdl default.jdl

生成应用

正如我们在前面的示例中看到的那样,生成应用程序非常简单,让我们以前面的示例为基础,并向其中添加更多内容:

application {
  config {
    baseName jhipster
    applicationType microservice
    serverPort 4242
    buildTool gradle
  }
}

让我们分解一下:

  • application 是你要声明一个应用程序的关键字
  • config 是你要指定配置
    • 稍后会看到你还可以在应用程序中声明实体
  • baseName, applicationType等是配置应用程序的关键字

这就是使用JDL创建应用程序的方式。 要查看所有受支持的应用程序选项,请转到 应用生成.


生成实体

生成实体可能没有想像的那么简单。 您也可以去 实体和属性 进一步了解您可以对实体执行的操作。

生成基本实体

entity A

该实体没有属性,甚至没有明确的表名(即便JHipster从该实体的名称自动设置了一个表名)。 这是声明实体的最简单方法。

请注意,此形式等效于:

entity A(a) {}

我们添加了数据库表名和大括号。 默认情况下,JHipster基于指定的实体名称生成表名称。

声明实体的属性时需要大括号。

添加注释

这是给实体添加注释的方法:

/**
 * This is a simple entity
 */
entity A

如果后端使用Java,则将添加Javadoc注释。

应用中的实体

仅在应用程序中生成某些实体,可以使用entities关键字:

application {
  config {}
  entities A, B
}

application {
  config {}
  entities C
}

entity A
entity B
entity C

这在微服务架构中特别有用。


生成属性

在实体中声明属性,需要声明实体的结构体并在其中实现:

entity MyEntity {
  name String
  closed Boolean
}

除以上两种方法外,更多请查看 实体和属性.

添加注释和校验

和注释添加到实体的方式相同,我们也可以将注释添加到字段:

entity MyEntity {
  /** My field */
  name String required minlength(2) maxlength(50)
}

校验取决于属性类型,有关校验的详细信息,请参见 实体和属性.


枚举

枚举是具有固定值的类型:

enum Type {
  A,
  B(b)
}

entity E {
  name Type
}

注意枚举的值是如何可选的。

他们只有一个校验规则:required

你可以查看更多关于 枚举 的详细信息。


关联关系

实体之间的关系也是可用的,并使用关键字relationship声明。

entity A
entity B

relationship OneToOne {
  A{a} to B{b}
}

在此我们可以看到:

  • OneToOne 是关系类型
    • 还有 OneToMany, ManyToManyManyToOne
  • 我们声明关系的来源和目的地(从 AB
  • 我们还声明了每个实体中的引入的属性名(在B实体中为属性a,在A实体中为属性b
    • 这意味着关系是双向的,即:双向一对一关联关系。

要了解更多关于关系的详细内容,你可以前往 关联关系.

单向关系还双向关系?

你可能希望单向的关系,而不是双向的,这取决于你如何设计你的模型。 可以通过不指定如下所示的引入属性来实现:

relationship OneToOne {
  A{a} to B
}

你可以都不指定引入的属性名,默认情况下将至少引入一个(在源中)

relationship OneToOne {
  A to B
}

关系注释和校验

关系也有注释和校验规则(只有required):

relationship OneToOne {
  A{a} to B{b required}
}

在此示例中,我们可以看到:

  • required 指定是否需要关系的一方。
    • 代替0..1,这种一对一关系要求b不能为空。

要了解更多关于关系的内容,你可以去相应的 关联关系页面。


选项

和在CLI中将选项应用于实体的方法相同,也可以在JDL中执行以下操作:

entity A
entity B
entity C

readOnly A
dto * with mapstruct
service * with serviceImpl
paginate A, B with pager

下面发生的事情,让你有意外的惊喜:

  • dtopaginateservice 是二元选项,因为它们需要一个实体列表和一个值
    • with 用于指定选项值
    • 注意 * 意味着该选项将应用于所有实体
  • readOnly 是一元选项,这意味着此类选项仅包含实体列表

声明实体列表的方法有多种:

  • 你可以一一列举,如:A, B, C
  • 您可以选择所有的:*all
    • 您可以指定排除某些实体: service * with serviceImpl except A, B

注解

注释是声明选项的另一种方法,让我们重写前面的示例:

@readOnly
@dto(mapstruct)
@service(serviceImpl)
@paginate(pager)
entity A

@dto(mapstruct)
@service(serviceImpl)
@paginate(pager)
entity B

@dto(mapstruct)
@service(serviceImpl)
entity C

类似于Java或Typescript,注释是”装饰器”,是实体的选项。

此示例与先前的示例等效,因为它们可用于生成相同的代码。

要了解有关选项的更多信息,您可以转到 选项


部署

最后,还可以使用deployment关键字从JDL文件生成部署,该关键字与JHipster v5.7及更高版本兼容:

deployment {
  deploymentType docker-compose
  appsFolders [foo, bar]
  dockerRepositoryName "yourDockerLoginName"
}

要导入一个或多个部署,您不必位于JHipster应用程序文件夹中。

有关部署的说明,请参见 部署.

一个JHipster部署具有对所有其他属性的默认值的配置和使用以前的语法将确保您的部署将使用默认值(就像您没有做出任何特定选择一样)。 最终的部署将具有:

  • deploymentType: docker-compose
  • appsFolders: foo, bar
  • dockerRepositoryName: yourDockerLoginName
  • serviceDiscoveryType: eureka
  • gatewayType: SpringCloudGateway
  • directoryPath: ../
  • 等等

现在,如果您需要一些自定义选项:

deployment {
  deploymentType kubernetes
  appsFolders [store, invoice, notification, product]
  dockerRepositoryName "yourDockerLoginName"
  serviceDiscoveryType no
  istio autoInjection
  kubernetesServiceType Ingress
  kubernetesNamespace jhipster
  ingressDomain "jhipster.192.168.99.100.nip.io"
}

这些选项只是JDL中可用选项的一个示例。 部署页面上提供了完整的选项列表,请查看 部署.


常量

JDL支持数字常量。 这是一个例子:

DEFAULT_MIN_LENGTH = 1
DEFAULT_MAX_LENGTH = 42
DEFAULT_MIN_BYTES = 20
DEFAULT_MAX_BYTES = 40
DEFAULT_MIN = 0
DEFAULT_MAX = 41

entity A {
  name String minlength(DEFAULT_MIN_LENGTH) maxlength(DEFAULT_MAX_LENGTH)
  content TextBlob required
  count Integer min(DEFAULT_MIN) max(DEFAULT_MAX)
}

导出JDL

如果您的应用程序中已经有实体并且希望拥有JDL文件,请不用担心! 您不必从头开始,因为有一个子生成可以为您完成此任务。

在应用程序的根文件夹中运行 jhipster export-jdl <FILE_NAME> ,您将拥有所有应用程序、实体、关系和选项在单个JDL文件中导出。

注意:您也不能为子生成器提供文件名,导出的JDL文件将以应用程序的基本名称命名。 例如,如果您的应用程序名为mySuperApp,则您的JDL文件将为mySuperApp.jdl