JDL
来源: |
时间:2018-11-09
|
|

JHipster域语言(JDL)

JDL是一种JHipster特定的域语言,我们在其中添加了使用简单且用户友好的语法在单个文件(或多个)中描述所有实体及其关系的可能性。

您可以使用我们的在线JDL-Studio IDE来创建JDL及其UML可视化。您也可以创建,导出或共享JDL模型的URL。

生成项目(现有项目或使用jhipster命令行生成)后,可以使用import-jdl子生成器通过运行生成JDL文件中的实体jhipster import-jdl your-jdl-file.jh(确保在JHipster项目下执行此命令)。

您还可以使用JHipster UML生成应用程序,实体并将其作为JDL文件导出,方法是jhipster-uml your-xmi-file.xmi --to-jdl从生成的JHipster应用程序的根目录运行要了解有关JHipster UML的更多信息并进行安装,请转到JHipster UML文档

这可以用作使用实体子生成器的替代我们的想法是,使用可视化工具管理关系比使用经典的Yeoman问题和答案更容易

JDL项目在GitHub上可用,它是一个像JHipster(Apache 2.0 License)这样的开源项目。它还可以用作节点库来进行JDL解析。

如果您喜欢JHipster领域语言,请不要忘记在GitHub上给该项目一个明星 如果您喜欢JDL Studio,请不要忘记让该项目成为GitHub的明星


这是JDL文档:

  1. JDL示例

  2. 如何使用它

  3. 语言

    1. 申请声明

    2. 实体宣言

    3. 关系宣言

    4. 枚举

    5. 斑点

    6. 期权声明

    7. 与微服务相关的选项

    8. 注释

  4. 评论

  5. 所有的关系

  6. 常量

  7. 工作流程

  8. 附件

    1. 可用的应用选项

    2. 可用的字段类型和约束

    3. 可用选项

  9. 问题和错误


JDL示例

Oracle“人力资源”示例应用程序已转换为JDL,可在此处获得默认情况下,JDL-Studio中也会加载相同的应用程序

如果你正在寻找更多的样品,对于一个回购权在这里

如何使用它

然后,您可以使用JDL文件生成实体:

  • 只需创建一个扩展名为“.jh”或“.jdl”的文件,

  • 声明您的实体和关系,或使用JDL-Studio创建和下载文件

  • 在您的JHipster应用程序的根文件夹中,运行jhipster import-jdl my_file.jdl

Voilà,你完成了!

如果您在团队中工作,也许您希望拥有多个文件而不是一个。我们添加了此选项,以便您不必手动将所有文件连接成一个,只需运行即可。

jhipster import-jdl my_file1.jh my_file2.jh

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

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

默认情况下,import-jdl仅重新生成已更改的实体,如果要重新生成所有实体,则传入--force 标志。请注意,这将覆盖对实体文件的所有本地更改

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

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

  • NPM: npm install jhipster-core --save

  • 纱: yarn add jhipster-core

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


语言

我们尽力保持语法对开发人员的友好。你可以用它来做这些事情:

  • 使用其选项和实体声明应用程序,

  • 声明具有其属性的实体,

  • 声明它们之间的关系,

  • 并声明一些JHipster特定选项。

如果您希望查看JDL的语法,可以在此处找到HTML文件 

申请声明

从v2.0.0开始,可以进行应用程序声明(与JHipster v5兼容)。

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

最基本的声明如下:

application {
  config {}}

JHipster应用程序具有默认值的配置,并使用以前的语法将确保您的应用程序使用默认值(就好像您没有做出任何特定选择)。由此产生的应用程序将:

  • baseName的: jhipster

  • 申请类型: monolith

  • 数据库类型: sql

  • 等等

现在,如果你想要一些自定义选项:

application {
  config {
    baseName myapp
    applicationType microservice
    prodDatabaseType postgresql
    buildTool gradle
  }}

这些选项只是JDL中可用内容的一个示例。完整的选项列表可在附件中找到

如果您需要多个应用程序,请按以下步骤操作:

application { // will be generated under the 'myFirstApp' folder
  config {
    baseName myFirstApp
  }}application { // will be generated under the 'mySecondApp' folder
  config {
    baseName mySecondApp
    applicationType microservice
  }}

您可以根据需要在任意数量的文件中拥有任意数量的应用程序:没有限制。

声明实体是最基本的东西,现在您可以设置应该在您想要的应用程序中生成哪个实体。

让我们改进前面的例子:

application {
  config {
    baseName myMonolith
    applicationType monolith
  }
  entities * except C, D}application {
  config {
    baseName myGateway
    applicationType gateway
    serverPort 9042
  }
  entities * except A, B}application {
  config {
    baseName microserviceA
    applicationType microservice
  }
  entities C}application {
  config {
    baseName microserviceB
    applicationType microservice
    serverPort 8082
  }
  entities D}entity Aentity Bentity Centity Ddto * with mapstructservice * with serviceClasspaginate D with pager

现在,生成这些应用程序和文件夹时会发生以下几件事:

  • 将创建四个应用程序:

    • 即使我们没有指定服务器端口,JHipster默认设置一个。

    • 对于微服务,默认设置是 8081

    • 对于网关和巨石,它是 8080

    • 对于UAA应用程序,它是 9999

    • myMonolith ./myMonolith,带有服务器端口8080

    • myGateway ./myGateway,带有服务器端口9042

    • microserviceA in ./microserviceA,带有服务器端口8081

    • microserviceB in ./microserviceB与服务器端口8082

  • 将生成四个实体

    • C 在第一个微服务中

    • D 在第二个微服务中

    • AB在整体

    • C并且D都在网关中

  • microservice选项隐含于CD

    • 因为它们是在两个微服务上生成的,所以默认情况下会设置此选项。

  • 选项的工作方式与以前相同

请注意,如果它们不存在(如databaseType,则生成器设置默认值JHipster Core做了完全相同的事情。

实体声明

实体声明如下:

entity <entity name> {
  <field name> <type> [<validation>*]}
  • <entity name> 是实体的名称,

  • <field name> 实体的一个字段的名称,

  • <type> JHipster支持该领域的类型,

  • 并作为<validation>该领域的验证选项

可能的类型和验证是这里描述的那些,如果验证需要一个值,只需(<value>)在验证名称后面添加即可

这是JDL代码的示例:

entity Aentity Bentity Centity D {
  name String required
  address String required maxlength(100)
  age Integer required min(18)}

正则表达式有点特殊,因为它们是这样使用的(从v1.3.6开始):

entity A {
  myString String required minlength(1) maxlength(42) pattern(/[A-Z]+/)}

如果您在v4.9.X之前使用生成器,则需要使用这样的模式pattern('[A-Z]+'

因为JDL易于使用和读取,如果您的实体为空(无字段),您只需使用entity A声明实体即可entity A {}

请注意,JHipster添加了一个默认id字段,因此您无需担心它。

关系声明

关系声明如下:

relationship (OneToMany | ManyToOne | OneToOne | ManyToMany) {
  <from entity>[{<relationship name>[(<display field>)]}] to <to entity>[{<relationship name>[(<display field>)]}]}
  • (OneToMany | ManyToOne| OneToOne | ManyToMany) 是你的关系的类型,

  • <from entity> 是关系的实体所有者的名称:来源,

  • <to entity> 是关系所在的实体的名称:目的地,

  • <relationship name> 是另一端为类型的字段的名称,

  • <display field>是应该在选择框中显示的字段的名称(默认值:) id

  • required 是否需要注入的场。

这是一个简单的例子:

entity Bookentity Authorrelationship ManyToOne {
  Book to Author}

声明注入字段是可选的,因为默认情况下根据需要设置一个(或两个)。前面的例子相当于这个例子:

entity Bookentity Authorrelationship ManyToOne {
  Book{author} to Author}

让它变得更复杂。一本书有一个必需的作者,一个作者有几本书。

entity Bookentity Author {
  name String required}relationship OneToMany {
  Author{book} to Book{writer(name) required}}

这里,Book该类将具有一个必需的字段writer,该name字段将通过字段链接Author

当然,在实际情况下,你会有很多关系,总是写相同的三行可能是乏味的。这就是为什么你可以声明类似的东西:

entity Aentity Bentity Centity Drelationship OneToOne {
  A{b} to B{a}
  B{c} to C}relationship ManyToMany {
  A{d} to D{a}
  C{d} to D{c}}

连接始终使用id字段完成,该字段也是在前端编辑关联时显示的默认字段。如果应该显示另一个字段,您可以像这样指定它:

entity A {
  name String required}entity Brelationship OneToOne {
  A{b} to B{a(name)}}

这使得JHipster生成一个REST资源,该资源将链接实体idname链接实体都返回给前端,因此可以向用户显示名称。

枚举

使用JDL制作Enums只需执行以下操作:

  • 在文件中声明所需的枚举:

      enum Language {
        FRENCH, ENGLISH, SPANISH
      }
  • 在实体中,使用Enum作为类型添加字段:

      entity Book {
        title String required,
        description String,
        language Language
      }

Blob(byte [])

JHipster提供了一个很好的选择,因为可以在图像类型或任何二进制类型之间进行选择。JDL可以让你做同样的事情。只需使用编辑器创建自定义类型(请参阅DataType),根据以下约定命名:

  • AnyBlob或者只是Blob创建“任何”二进制类型的字段;

  • ImageBlob 创建一个意味着成像的领域。

  • TextBlob 为CLOB创建一个字段(长文本)。

您可以根据需要创建任意数量的DataType。

期权声明

在JHipster中,您可以为您的实体指定选项,例如分页或DTO。您可以使用JDL执行相同的操作:

entity A {
  name String required}entity Bentity Cdto A, B with mapstructpaginate A with infinite-scrollpaginate B with paginationpaginate C with pager  // pager is only available in AngularJSservice A with serviceClassservice C with serviceImpl

关键字dtopaginateservicewith加入到语法来支持这些变化。如果指定了错误的选项,JDL将通过一条漂亮的红色消息通知您,并且将忽略它以免损坏JHipster的JSON文件。

服务选项

指定的服务不会创建将直接调用存储库接口的资源类。这是默认和最简单的选项,请参阅A.使用serviceClass(参见B)的服务将使资源调用将调用存储库接口的服务类。使用serviceImpl(参见C)的服务将创建一个将由资源类使用的服务接口。该接口由一个具体类实现,该类将调用存储库接口。

使用无服务uless肯定是最简单的选择,适合CRUD。如果您将拥有许多将使用多个存储库的业务逻辑,那么将服务与类一起使用,使其成为服务类的理想选择。Jhipsters并不是不必要的接口的粉丝,但如果你喜欢它们,那就去购买impl。

entity Aentity Bentity C// no service for Aservice B with serviceClassservice C with serviceImpl

JDL还支持批量选项设置。有可能做到:

entity Aentity B...entity Zdto * with mapstructservice all with serviceImplpaginate C with pagination

请注意*并且all是等效的。最新版本引入了排除项(在为每个实体设置选项时,这是一个非常强大的选项):

entity Aentity B...entity Zdto * with mapstruct except Aservice all with serviceImpl except A, B, Cpaginate C with pagination

使用JHipster,您还可以判断您是否不需要任何客户端代码或服务器代码。即使您想为Angular相关文件添加后缀,也可以在JHipster中执行此操作。 可以基于每个实体激活 过滤选项:过滤器<entity name>或所有实体:过滤器*在JDL文件中,只需添加以下行即可:

entity Aentity Bentity CskipClient AskipServer BangularSuffix * with mySuperEntitiesfilter C

最后,还可以指定表名(默认情况下将使用实体的名称):

entity A // A is the table's name hereentity B (the_best_entity) // the_best_entity is the table's name

从JHipster v3开始,可以创建微服务。您可以指定一些选项以在JDL中生成实体:微服务的名称和搜索引擎。

以下是如何指定微服务的名称(JHipster应用程序的名称):

entity Aentity Bentity Cmicroservice * with mysuperjhipsterapp except Cmicroservice C with myotherjhipsterappsearch * with elasticsearch except C

第一个选项用于告诉JHipster您希望您的微服务处理您的实体,而第二个选项指定您希望如何以及是否希望搜索实体。

注释

自JHipster v5以来可以使用注释。与Java中可能的类似,注释的工作方式相同,因此您可以使用注释选项注释实体。

以此JDL代码为例:

entity Aentity Bentity Cdto C with mapstructpaginate * with pager except Csearch A with elasticsearch

这是它与注释的等价物:

@paginate(pager)@search(elasticsearch)entity A@paginate(pager)entity B@dto(mapstruct)entity C

虽然这会增加比实际删除的代码更多的代码,但在使用多个JDL文件(例如微服务)时它实际上很有用。

评论和Javadoc

可以将Javadoc和注释添加到JDL文件中。
就像在Java中一样,这个例子演示了如何添加Javadoc注释:

/**
 * Class comments.
 * @author The JHipster team.
 */entity MyEntity { // another form of comment
  /** A required attribute */
  myField String required
  mySecondField String // another form of comment}/**
 * Second entity.
 */entity MySecondEntity {}relationship OneToMany {
  /** This is possible too! */
  MyEntity{mySecondEntity}
  to
  /**
   * And this too!
   */
  MySecondEntity{myEntity}}

这些评论稍后将作为JHipster的Javadoc评论添加。

JDL拥有自己的评论:

// an ignored comment/** not an ignored comment */

因此,任何以开头的内容都//被视为JDL的内部注释,不会被视为Javadoc。

请注意,#在解析期间将忽略以...开头的JDL Studio指令

另一种形式的评论是以下评论:

entity A {
  name String /** My super field */
  count Integer /** My other super field */}

这里A的名字将被注释My super field,B与My other super field是的,逗号不是强制性的,但更明智的做法就是不要在代码中出错。如果你想混淆逗号和注释,请注意!

entity A {
  name String, /** My comment */
  count Integer}

A的名字不会有评论,因为计数会。

所有的关系

有关如何与JDL建立关系的说明。

一到一

汽车有司机的双向关系,司机有汽车。

entity Driverentity Carrelationship OneToOne {
  Car{driver} to Driver{car}}

一个单向示例,其中公民有护照,但护照无法访问其所有者。

entity Citizenentity Passportrelationship OneToOne {
  Citizen to Passport}

一个一对多

所有者没有,一个或多个Car对象,并且Car知道其所有者的双向关系。

entity Ownerentity Carrelationship OneToMany {
  Owner{car} to Car{owner}}

JHipster不支持此关系的单向版本,但它看起来像这样:

entity Ownerentity Carrelationship OneToMany {
  Owner to Car}

多到一

一对多关系的互惠版本与之前相同。汽车了解其所有者的单向版本:

entity Ownerentity Carrelationship ManyToOne {
  Car to Owner}

许多一对多

最后,在这个例子中,我们让Car知道它的驱动程序,而Driver对象可以访问它的汽车。

entity Driverentity Carrelationship ManyToMany {
  Car{driver} to Driver{car}}

请注意,关系的拥有方必须在左侧

常量

从JHipster Core v1.2.7开始,JDL支持数值常量。这是一个例子:

DEFAULT_MIN_LENGTH = 1DEFAULT_MAX_LENGTH = 42DEFAULT_MIN_BYTES = 20DEFAULT_MAX_BYTES = 40DEFAULT_MIN = 0DEFAULT_MAX = 41entity A {
  name String minlength(DEFAULT_MIN_LENGTH) maxlength(DEFAULT_MAX_LENGTH)
  content TextBlob required
  count Integer min(DEFAULT_MIN) max(DEFAULT_MAX)}

工作流程

Monolith工作流程

这里没有特殊的工作流程:

  • 创建应用程序

  • 创建JDL文件

  • 导入它

微服务工作流程

处理微服务有点棘手,但JDL为您提供了一些选项来处理您认为合适的实体。

随着microservice <ENTITIES> with <MICROSERVICE_APP_NAME>您可以指定哪些实体,该微服务获取生成。以此设置为例:

entity Aentity Bentity Cmicroservice A with firstMSmicroservice B with secondMS

给定两个JHipster应用程序('firstMS'和'secondMS'),如果您在两个应用程序中导入JDL文件,那么您将获得以下内容:

  • 在“firstMS”,实体AC将会产生。

  • 在“secondMS”,实体BC将会产生。

C在两者中生成,因为如果没有微服务选项指定生成此实体的位置,它将在任何地方生成。如果您决定在整体应用程序中导入此JDL,则将生成每个实体(整体在JDL中没有限制选项)。

注意:如果要在两个不同的微服务中生成相同的实体,可以编写两个JDL文件而不是更新JDL文件。每次。

前面的例子不能这样写:

entity Aentity Bentity Cmicroservice * except B with firstMSmicroservice * except A with secondMS

这是结果:

  • 在'firstMS'中,仅C生成实体

  • 在“secondMS”,实体BC将会产生。这是因为,在解析时,如果选项与另一个选项重叠,则后者优先。


附件

可用的应用选项

以下是JDL支持的应用程序选项:

JDL选项名称默认值可能的值评论
申请类型整体巨石,微服务,网关,uaa
authenticationTypejwt或uaajwt,session,uaa,oauth2uaa适用于UAA应用程序,jwt否则
baseName的jhipster

buildTool行家maven,gradle
的cacheProviderehcache或hazelcastehcache,hazelcast,infinispan,no单片和网关的ehcache,否则为hazelcast
clientFrameworkangularXangularX,反应
clientPackageManagerNPMnpm,纱线
数据库类型SQLsql,mongodb,cassandra,couchbase,没有
devDatabaseTypeh2Diskh2Disk,h2Memory,** + prod数据库类型
enableHibernateCache真正

enableSwaggerCodegen

enableTranslation真正

jhiPrefixJHI

jhipsterVersion

不推荐使用,将在下一个主要版本中删除。此字段将采用生成器的版本,必须在双引号之间。
语言[en,fr]JHipster提供的语言大括号是强制性的
messageBroker卡夫卡,假
母语JHipster支持的任何语言
包裹名字com.mycompany.myapp
设置packageFolder选项
prodDatabaseTypeMySQL的mysql,mariadb,mssql,postgresql,oracle,no
搜索引擎elasticsearch,false
服务器端口8080,8081或9999
取决于应用类型
serviceDiscoveryType尤里卡,领事,没有
skipClient

skipServer

skipUserManagement真正

testFrameworks[]量角器,黄瓜,加特林大括号必须
uaaBaseName

对于网关和微服务,如果auth类型为uaa,则必须在双引号之间
useSass

的WebSocketspring-websocket,false

可用的字段类型和约束

以下是JDL支持的类型:

常用数据库:

  • PostgreSQL的

  • MySQL的

  • MariaDB的

  • 神谕

  • MSSQL

  • MongoDB的

  • Couchbase

常用数据库卡桑德拉验证
必需的,最小长度,最大长度,模式,独特
整数整数必需,最小,最大,唯一
必需,最小,最大,唯一
BigDecimal的BigDecimal的必需,最小,最大,唯一
浮动浮动必需,最小,最大,唯一
必需,最小,最大,唯一
枚举
要求,独特
布尔布尔要求,独特
LOCALDATE的
要求,独特

日期要求,独特
ZonedDateTime
要求,独特

UUID要求,独特
斑点
必需,minbytes,maxbytes,unique
AnyBlob
必需,minbytes,maxbytes,unique
ImageBlob
必需,minbytes,maxbytes,unique
TextBlob
要求,独特
瞬间瞬间要求,独特

可用选项

一元期权

这些选项没有任何价值:

  • skipClient

  • skipServer

  • noFluentMethod

  • filter

他们可以像这样使用: <OPTION> <ENTITIES | * | all> except? <ENTITIES>

二元期权

这些选项取值:

  • dtomapstruct

  • serviceserviceClassserviceImpl

  • paginatepagerpaginationinfinite-scroll

  • searchelasticsearch

  • microservice (自定义价值)

  • angularSuffix (自定义价值)

  • clientRootFolder (自定义价值)

问题和错误

JDL 可以在GitHub上获得,并遵循与JHipster相同的 贡献指南

请使用我们的项目提交有关图书馆本身的问题和请求。

提交任何内容时,您必须尽可能准确:

  • 一个发布的问题必须只有一个问题(或一个需求/问题);

  • 拉请求是受欢迎的,但提交必须是'原子'才能真正理解。





提交
查看更多评论
没有更多评论