仅适用于jhipster 5.1.0
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文档。
这可以代替使用实体子生成器。这个想法是,使用视觉工具来管理关系比使用经典的约曼问答更容易。
JDL项目可在GitHub上获得,它是一个开源项目,例如JHipster(Apache 2.0许可)。它也可以用作执行JDL解析的节点库。
如果您喜欢JHipster域语言,请不要忘记在GitHub上给项目加星号! 如果您喜欢JDL Studio,请不要忘记在GitHub上给该项目加分!
这是完整的JDL文档:
- JDL示例
- 如何使用它
-
语言
3.1 实体声明
3.2 关系声明
3.3 枚举
3.4 斑点
3.5 选项声明
3.6 与微服务相关的选项 - 评论
- 所有关系
- 常数
-
附件
7.1 可用类型和约束
7.2 可用选项 - 问题与错误
JDL示例
Oracle“人力资源”示例应用程序已转换为JDL,可在此处获得。默认情况下,同样的应用程序也会加载到JDL-Studio中。
如何使用它
如果要使用JHipster UML代替import-jdl
子生成器,则需要通过运行进行安装npm install -g jhipster-uml
。
然后,您可以使用JDL文件生成实体:
- 只需创建扩展名为“ .jh”或“ .jdl”的文件,
- 声明您的实体和关系,或使用JDL-Studio创建和下载文件,
- 在您的JHipster应用程序的根文件夹中,运行
jhipster import-jdl my_file.jdl
或jhipster-uml my_file.jdl
。
和Voilà,您完成了!
如果您在团队中工作,也许您希望拥有多个文件而不是一个文件。我们添加了此选项,因此您不必手动将所有文件串联在一起,只需运行jhipster import-jdl my_file1.jh my_file2.jh
或即可jhipster-uml 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 install jhipster-core --save
本地安装它并将其保存在package.json
文件中来进行添加。
语言
我们试图使语法对开发人员尽可能友好。您可以用它做三件事:
- 声明实体及其属性,
- 声明他们之间的关系,
- 并声明一些JHipster特定的选项。
实体声明
实体声明如下:
entity <entity name> {
<field name> <type> [<validation>*]
}
-
<entity name>
是实体的名称, -
<field name>
实体一个字段的名称, -
<type>
JHipster支持的字段类型, - 并可以选择
<validation>
验证该字段。
可能的类型和验证是那些描述这里,如果验证需要一个值,只需添加(<value>)
验证的名字之后。
这是一个JDL代码示例:
entity A
entity B
entity C
entity 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 Book
entity Author {
name String required
}
relationship OneToMany {
Author{book} to Book{writer(name) required}
}
在这里,Book
该类将具有一个必填字段writer
,该name
字段将通过的字段进行链接Author
。
当然,在实际情况下,您将有很多关系,并且始终编写相同的三行代码可能会很乏味。这就是为什么您可以声明如下内容:
entity A
entity B
entity C
entity D
relationship 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 B
relationship OneToOne {
A{b} to B{a(name)}
}
这使JHipster生成了一个REST资源,该资源将链接的实体id
和两者都返回name
到前端,因此可以将名称显示给用户。
枚举
要使用JDL枚举,请执行以下操作:
-
在文件中的所需位置声明一个枚举:
enum Language { FRENCH, ENGLISH, SPANISH }
-
在实体中,添加以Enum作为类型的字段:
entity Book { title String required, description String, language Language }
Blob(字节[])
JHipster提供了一个不错的选择,因为可以在图像类型或任何二进制类型之间进行选择。JDL允许您执行相同的操作:只需使用编辑器创建一个自定义类型(请参阅DataType),然后根据以下约定对其进行命名:
-
AnyBlob
或仅Blob
创建“ any”二进制类型的字段; -
ImageBlob
创建一个意为图像的字段。 -
TextBlob
为CLOB(长文本)创建一个字段。
您可以根据需要创建任意多个DataType。
期权申报
在JHipster中,您可以为实体指定选项,例如分页或DTO。您可以对JDL执行相同的操作:
entity A {
name String required
}
entity B
entity C
dto A, B with mapstruct
paginate A with infinite-scroll
paginate B with pagination
paginate C with pager // pager is only available in AngularJS
service A with serviceClass
service C with serviceImpl
关键字dto
,paginate
,service
并with
加入到语法来支持这些变化。如果指定了错误的选项,那么JDL会用一条漂亮的红色消息通知您,并且只会忽略它,以免损坏JHipster的JSON文件。
服务选项
指定的服务不会创建将直接调用存储库接口的资源类。这是默认和最简单的选项,请参阅A。带有serviceClass的服务(请参见B)将使资源调用服务类,后者将调用存储库接口。带serviceImpl的Service(请参阅C)将创建一个服务接口,该接口将由资源类使用。该接口由impl类实现,该类将调用存储库接口。
如果不确定这是最简单的选择并且对CRUD有用,则不使用任何服务。如果您将有很多业务逻辑,这些业务逻辑将使用多个存储库,则非常适合将服务与类一起使用,这使其成为服务类的理想选择。Jhipster并不喜欢不需要的接口,但是如果您喜欢它们,请使用impl进行服务。
entity A
entity B
entity C
// no service for A
service B with serviceClass
service C with serviceImpl
JDL还支持批量选项设置。可以这样做:
entity A
entity B
...
entity Z
dto * with mapstruct
service all with serviceImpl
paginate C with pagination
请注意,*
和all
是等效的。最新版本引入了排除功能(在为每个实体设置选项时,这是一个功能强大的选项):
entity A
entity B
...
entity Z
dto * with mapstruct except A
service all with serviceImpl except A, B, C
paginate C with pagination
使用JHipster,您还可以告诉您是否需要任何客户端代码或服务器代码。即使您想在与Angular相关的文件中添加后缀,也可以在JHipster中进行。在您的JDL文件中,只需添加以下几行即可:
entity A
entity B
entity C
skipClient for A
skipServer for B
angularSuffix * with mySuperEntities
最后,还可以指定表名(默认情况下将使用实体名称):
entity A // A is the table's name here
entity B (the_best_entity) // the_best_entity is the table's name
与微服务相关的选项
从JHipster v3开始,可以创建微服务。您可以指定一些选项以在JDL中生成您的实体:微服务的名称和搜索引擎。
您可以通过以下方法指定微服务的名称(JHipster应用程序的名称):
entity A
entity B
entity C
microservice * with mysuperjhipsterapp except C
microservice C with myotherjhipsterapp
search * with elasticsearch except C
第一个选项用于告诉JHipster您希望微服务处理您的实体,而第二个选项指定如何以及是否希望搜索实体。
评论和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 */
因此,任何//
以J 开头的内容都被视为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 Driver
entity Car
relationship OneToOne {
Car{driver} to Driver{car}
}
一个单向示例,其中一个公民拥有一个护照,但该护照无权独占其所有者。
entity Citizen
entity Passport
relationship OneToOne {
Citizen{passport} to Passport
}
一对多
双向关系,其中所有者没有,一个或多个Car对象,并且Car知道其所有者。
entity Owner
entity Car
relationship OneToMany {
Owner{car} to Car{owner}
}
JHipster不支持这种关系的单向版本,但是看起来像这样:
entity Owner
entity Car
relationship OneToMany {
Owner{car} to Car
}
多对一
一对多关系的互惠版本与以前相同。汽车认识车主的单向版本:
entity Owner
entity Car
relationship ManyToOne {
Car{owner} to Owner
}
多对多
最后,在此示例中,我们的Car知道其驾驶员,并且Driver对象可以访问其汽车。
entity Driver
entity Car
relationship ManyToMany {
Car{driver} to Driver{car}
}
请注意,关系的拥有方必须在左侧
常数
从JHipster Core v1.2.7开始,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 minbytes(DEFAULT_MIN_BYTES) maxbytes(DEFAULT_MAX_BYTES)
count Integer min(DEFAULT_MIN) max(DEFAULT_MAX)
}
附件
可用的类型和约束
这是JDL支持的类型:
| 的SQL | MongoDB | 卡桑德拉 | 验证方式 |
| 串 | 串 | 串 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小长度,最大长度,模式</dfn> |
| 整数 | 整数 | 整数 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需,最小,最大</dfn> |
| 长 | 长 | 长 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需,最小,最大</dfn> |
| 大十进制 | 大十进制 | 大十进制 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需,最小,最大</dfn> |
| 浮动 | 浮动 | 浮动 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需,最小,最大</dfn> |
| 双 | 双 | 双 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需,最小,最大</dfn> |
| 枚举 | 枚举 | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
| 布尔型 | 布尔型 | 布尔型 | 需要 |
| 本地日期 | 本地日期 | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
| | | 日期 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
| ZonedDateTime | ZonedDateTime | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
| | | UUID | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
| 斑点 | 斑点 | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小字节,最大字节</dfn> |
| AnyBlob | AnyBlob | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小字节,最大字节</dfn> |
| ImageBlob | ImageBlob | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小字节,最大字节</dfn> |
| TextBlob | TextBlob | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小字节,最大字节</dfn> |
| 瞬间 | 瞬间 | 瞬间 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
可用选项
一元期权
这些选项没有任何价值:
skipClient
skipServer
noFluentMethod
filter
它们可以这样使用: <OPTION> <ENTITIES | * | all> except? <ENTITIES>
二元期权
这些选项采用以下值:
-
dto
(mapstruct
) -
service
(serviceClass
,serviceImpl
) -
paginate
(pager
,pagination
,infinite-scroll
) -
search
(elasticsearch
) -
microservice
(自定义值) -
angularSuffix
(自定义值)
问题与错误
JDL 在GitHub上可用,并遵循与JHipster相同的贡献准则。
请使用我们的项目提交有关库本身的问题和请求请求。
提交任何内容时,您都必须尽可能精确:
- 一个已发布的问题只能有一个问题(或一个需求/问题);
- 拉请求是受欢迎的,但是提交必须是“原子的”才能真正理解。
网友评论