僅適用于jhipster 5.1.0
JHipster域語(yǔ)言(JDL)
JDL是JHipster特定的領(lǐng)域語(yǔ)言傅寡,在其中我們?cè)黾恿耸褂煤?jiǎn)單且用戶友好的語(yǔ)法在單個(gè)文件(或多個(gè)文件)中描述所有實(shí)體及其關(guān)系的可能性命贴。
您可以使用我們的在線JDL-Studio IDE來(lái)創(chuàng)建JDL及其UML可視化。您也可以創(chuàng)建和導(dǎo)出或共享JDL模型的URL宰闰。
一旦生成了項(xiàng)目(現(xiàn)有項(xiàng)目或使用jhipster
命令行生成),就可以使用import-jdl
子生成器通過(guò)運(yùn)行從JDL文件中生成實(shí)體jhipster import-jdl your-jdl-file.jh
(請(qǐng)確保在您的JHipster項(xiàng)目下執(zhí)行此命令)。您也可以使用JHipster UML生成實(shí)體并將其導(dǎo)出為JDL文件抖甘,方法是jhipster-uml your-xmi-file.xmi --to-jdl
從生成的JHipster應(yīng)用程序的根目錄運(yùn)行。要了解有關(guān)JHipster UML的更多信息并進(jìn)行安裝葫慎,請(qǐng)轉(zhuǎn)到JHipster UML文檔衔彻。
這可以代替使用實(shí)體子生成器。這個(gè)想法是偷办,使用視覺(jué)工具來(lái)管理關(guān)系比使用經(jīng)典的約曼問(wèn)答更容易艰额。
JDL項(xiàng)目可在GitHub上獲得,它是一個(gè)開(kāi)源項(xiàng)目椒涯,例如JHipster(Apache 2.0許可)柄沮。它也可以用作執(zhí)行JDL解析的節(jié)點(diǎn)庫(kù)。
如果您喜歡JHipster域語(yǔ)言废岂,請(qǐng)不要忘記在GitHub上給項(xiàng)目加星號(hào)祖搓! 如果您喜歡JDL Studio,請(qǐng)不要忘記在GitHub上給該項(xiàng)目加分湖苞!
這是完整的JDL文檔:
- JDL示例
- 如何使用它
-
語(yǔ)言
3.1 實(shí)體聲明
3.2 關(guān)系聲明
3.3 枚舉
3.4 斑點(diǎn)
3.5 選項(xiàng)聲明
3.6 與微服務(wù)相關(guān)的選項(xiàng) - 評(píng)論
- 所有關(guān)系
- 常數(shù)
-
附件
7.1 可用類型和約束
7.2 可用選項(xiàng) - 問(wèn)題與錯(cuò)誤
JDL示例
Oracle“人力資源”示例應(yīng)用程序已轉(zhuǎn)換為JDL拯欧,可在此處獲得。默認(rèn)情況下财骨,同樣的應(yīng)用程序也會(huì)加載到JDL-Studio中镐作。
如何使用它
如果要使用JHipster UML代替import-jdl
子生成器,則需要通過(guò)運(yùn)行進(jìn)行安裝npm install -g jhipster-uml
蚓再。
然后滑肉,您可以使用JDL文件生成實(shí)體:
- 只需創(chuàng)建擴(kuò)展名為“ .jh”或“ .jdl”的文件包各,
- 聲明您的實(shí)體和關(guān)系摘仅,或使用JDL-Studio創(chuàng)建和下載文件,
- 在您的JHipster應(yīng)用程序的根文件夾中问畅,運(yùn)行
jhipster import-jdl my_file.jdl
或jhipster-uml my_file.jdl
娃属。
和Voilà,您完成了护姆!
如果您在團(tuán)隊(duì)中工作矾端,也許您希望擁有多個(gè)文件而不是一個(gè)文件。我們添加了此選項(xiàng)卵皂,因此您不必手動(dòng)將所有文件串聯(lián)在一起秩铆,只需運(yùn)行jhipster import-jdl my_file1.jh my_file2.jh
或即可jhipster-uml my_file1.jh my_file2.jh
。
如果不想重新生成實(shí)體,則在導(dǎo)入JDL時(shí)殴玛,可以使用該--json-only
標(biāo)志跳過(guò)實(shí)體創(chuàng)建部分捅膘,僅在文件.jhipster
夾中創(chuàng)建json文件。
jhipster import-jdl ./my-jdl-file.jdl --json-only
默認(rèn)情況下滚粟,import-jdl
僅重新生成已更改的實(shí)體寻仗,如果要重新生成所有實(shí)體,則傳遞該--force
標(biāo)志凡壤。請(qǐng)注意署尤,這將覆蓋您對(duì)實(shí)體文件的所有本地更改
jhipster import-jdl ./my-jdl-file.jdl --force
如果要在項(xiàng)目中使用它,可以通過(guò)在npm install jhipster-core --save
本地安裝它并將其保存在package.json
文件中來(lái)進(jìn)行添加亚侠。
語(yǔ)言
我們?cè)噲D使語(yǔ)法對(duì)開(kāi)發(fā)人員盡可能友好曹体。您可以用它做三件事:
- 聲明實(shí)體及其屬性,
- 聲明他們之間的關(guān)系硝烂,
- 并聲明一些JHipster特定的選項(xiàng)混坞。
實(shí)體聲明
實(shí)體聲明如下:
entity <entity name> {
<field name> <type> [<validation>*]
}
-
<entity name>
是實(shí)體的名稱, -
<field name>
實(shí)體一個(gè)字段的名稱钢坦, -
<type>
JHipster支持的字段類型究孕, - 并可以選擇
<validation>
驗(yàn)證該字段。
可能的類型和驗(yàn)證是那些描述這里爹凹,如果驗(yàn)證需要一個(gè)值厨诸,只需添加(<value>)
驗(yàn)證的名字之后。
這是一個(gè)JDL代碼示例:
entity A
entity B
entity C
entity D {
name String required,
address String required maxlength(100),
age Integer required min(18)
}
正則表達(dá)式有點(diǎn)特殊禾酱,因?yàn)樗鼈兊挠梅ㄈ缦拢▉?lái)自v1.3.6):
entity A {
myString String required minlength(1) maxlength(42) pattern(/[A-Z]+/)
}
如果您使用的是v4.9.X之前的生成器微酬,則需要使用類似的模式pattern('[A-Z]+'
。
因?yàn)镴DL易于使用和讀取颤陶,所以如果您的實(shí)體為空(無(wú)字段)颗管,則可以使用entity A
或聲明實(shí)體entity A {}
。
請(qǐng)注意滓走,JHipster添加了一個(gè)默認(rèn)id
字段垦江,因此您不必?fù)?dān)心它。
關(guān)系聲明
關(guān)系聲明如下:
relationship (OneToMany | ManyToOne | OneToOne | ManyToMany) {
<from entity>[{<relationship name>[(<display field>)]}] to <to entity>[{<relationship name>[(<display field>)]}]
}
-
(OneToMany | ManyToOne| OneToOne | ManyToMany)
是你的關(guān)系類型 -
<from entity>
是關(guān)系的實(shí)體所有者的名稱:來(lái)源搅方, -
<to entity>
是關(guān)系要到達(dá)的實(shí)體的名稱:目的地比吭, -
<relationship name>
是具有另一端類型的字段名稱, -
<display field>
是應(yīng)顯示在選擇框中的字段名稱(默認(rèn)值:)id
姨涡, -
required
是否需要注入字段衩藤。
這是一個(gè)簡(jiǎn)單的例子:
一本書(shū)有一個(gè)必填的作者,一個(gè)作者有幾本書(shū)涛漂。
entity Book
entity Author {
name String required
}
relationship OneToMany {
Author{book} to Book{writer(name) required}
}
在這里赏表,Book
該類將具有一個(gè)必填字段writer
,該name
字段將通過(guò)的字段進(jìn)行鏈接Author
。
當(dāng)然瓢剿,在實(shí)際情況下岁诉,您將有很多關(guān)系,并且始終編寫(xiě)相同的三行代碼可能會(huì)很乏味跋选。這就是為什么您可以聲明如下內(nèi)容:
entity A
entity B
entity C
entity D
relationship OneToOne {
A涕癣 to B{a},
B{c} to C
}
relationship ManyToMany {
Ankhnmjl to D{a},
Ccgeeifh to D{c}
}
始終使用該id
字段來(lái)完成聯(lián)接,該字段也是在前端編輯關(guān)系時(shí)顯示的默認(rèn)字段前标。如果應(yīng)該顯示另一個(gè)字段坠韩,則可以這樣指定:
entity A {
name String required
}
entity B
relationship OneToOne {
A to B{a(name)}
}
這使JHipster生成了一個(gè)REST資源炼列,該資源將鏈接的實(shí)體id
和兩者都返回name
到前端只搁,因此可以將名稱顯示給用戶。
枚舉
要使用JDL枚舉俭尖,請(qǐng)執(zhí)行以下操作:
-
在文件中的所需位置聲明一個(gè)枚舉:
enum Language { FRENCH, ENGLISH, SPANISH }
-
在實(shí)體中氢惋,添加以Enum作為類型的字段:
entity Book { title String required, description String, language Language }
Blob(字節(jié)[])
JHipster提供了一個(gè)不錯(cuò)的選擇,因?yàn)榭梢栽趫D像類型或任何二進(jìn)制類型之間進(jìn)行選擇稽犁。JDL允許您執(zhí)行相同的操作:只需使用編輯器創(chuàng)建一個(gè)自定義類型(請(qǐng)參閱DataType)焰望,然后根據(jù)以下約定對(duì)其進(jìn)行命名:
-
AnyBlob
或僅Blob
創(chuàng)建“ any”二進(jìn)制類型的字段; -
ImageBlob
創(chuàng)建一個(gè)意為圖像的字段已亥。 -
TextBlob
為CLOB(長(zhǎng)文本)創(chuàng)建一個(gè)字段熊赖。
您可以根據(jù)需要?jiǎng)?chuàng)建任意多個(gè)DataType。
期權(quán)申報(bào)
在JHipster中虑椎,您可以為實(shí)體指定選項(xiàng)震鹉,例如分頁(yè)或DTO。您可以對(duì)JDL執(zhí)行相同的操作:
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
關(guān)鍵字dto
捆姜,paginate
传趾,service
并with
加入到語(yǔ)法來(lái)支持這些變化。如果指定了錯(cuò)誤的選項(xiàng)泥技,那么JDL會(huì)用一條漂亮的紅色消息通知您浆兰,并且只會(huì)忽略它,以免損壞JHipster的JSON文件零抬。
服務(wù)選項(xiàng)
指定的服務(wù)不會(huì)創(chuàng)建將直接調(diào)用存儲(chǔ)庫(kù)接口的資源類镊讼。這是默認(rèn)和最簡(jiǎn)單的選項(xiàng),請(qǐng)參閱A平夜。帶有serviceClass的服務(wù)(請(qǐng)參見(jiàn)B)將使資源調(diào)用服務(wù)類,后者將調(diào)用存儲(chǔ)庫(kù)接口卸亮。帶serviceImpl的Service(請(qǐng)參閱C)將創(chuàng)建一個(gè)服務(wù)接口忽妒,該接口將由資源類使用。該接口由impl類實(shí)現(xiàn),該類將調(diào)用存儲(chǔ)庫(kù)接口段直。
如果不確定這是最簡(jiǎn)單的選擇并且對(duì)CRUD有用吃溅,則不使用任何服務(wù)。如果您將有很多業(yè)務(wù)邏輯鸯檬,這些業(yè)務(wù)邏輯將使用多個(gè)存儲(chǔ)庫(kù)决侈,則非常適合將服務(wù)與類一起使用,這使其成為服務(wù)類的理想選擇喧务。Jhipster并不喜歡不需要的接口赖歌,但是如果您喜歡它們,請(qǐng)使用impl進(jìn)行服務(wù)功茴。
entity A
entity B
entity C
// no service for A
service B with serviceClass
service C with serviceImpl
JDL還支持批量選項(xiàng)設(shè)置庐冯。可以這樣做:
entity A
entity B
...
entity Z
dto * with mapstruct
service all with serviceImpl
paginate C with pagination
請(qǐng)注意坎穿,*
和all
是等效的展父。最新版本引入了排除功能(在為每個(gè)實(shí)體設(shè)置選項(xiàng)時(shí),這是一個(gè)功能強(qiáng)大的選項(xiàng)):
entity A
entity B
...
entity Z
dto * with mapstruct except A
service all with serviceImpl except A, B, C
paginate C with pagination
使用JHipster玲昧,您還可以告訴您是否需要任何客戶端代碼或服務(wù)器代碼栖茉。即使您想在與Angular相關(guān)的文件中添加后綴,也可以在JHipster中進(jìn)行孵延。在您的JDL文件中衡载,只需添加以下幾行即可:
entity A
entity B
entity C
skipClient for A
skipServer for B
angularSuffix * with mySuperEntities
最后,還可以指定表名(默認(rèn)情況下將使用實(shí)體名稱):
entity A // A is the table's name here
entity B (the_best_entity) // the_best_entity is the table's name
與微服務(wù)相關(guān)的選項(xiàng)
從JHipster v3開(kāi)始隙袁,可以創(chuàng)建微服務(wù)痰娱。您可以指定一些選項(xiàng)以在JDL中生成您的實(shí)體:微服務(wù)的名稱和搜索引擎。
您可以通過(guò)以下方法指定微服務(wù)的名稱(JHipster應(yīng)用程序的名稱):
entity A
entity B
entity C
microservice * with mysuperjhipsterapp except C
microservice C with myotherjhipsterapp
search * with elasticsearch except C
第一個(gè)選項(xiàng)用于告訴JHipster您希望微服務(wù)處理您的實(shí)體菩收,而第二個(gè)選項(xiàng)指定如何以及是否希望搜索實(shí)體梨睁。
評(píng)論和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有自己的一種評(píng)論:
// an ignored comment
/** not an ignored comment */
因此,任何//
以J 開(kāi)頭的內(nèi)容都被視為JDL的內(nèi)部注釋箱舞,因此不會(huì)被視為Javadoc遍坟。
請(qǐng)注意,#
在解析期間晴股,以開(kāi)頭的JDL Studio指令將被忽略愿伴。
注釋的另一種形式是以下注釋:
entity A {
name String /** My super field */
count Integer /** My other super field */
}
在這里,A的名稱將帶有注釋My super field
电湘,B的將帶有注釋My other super field
隔节。是的鹅经,逗號(hào)不是強(qiáng)制性的,但最好使用逗號(hào)怎诫,以免在代碼中出錯(cuò)瘾晃。如果您想混合使用逗號(hào)和以下注釋,請(qǐng)當(dāng)心幻妓!
entity A {
name String, /** My comment */
count Integer
}
A的名字將沒(méi)有注釋蹦误,因?yàn)橛?jì)數(shù)會(huì)。
所有關(guān)系
有關(guān)如何使用JDL創(chuàng)建關(guān)系的說(shuō)明肉津。
一對(duì)一
雙向關(guān)系强胰,其中汽車(chē)有駕駛員,而駕駛員有汽車(chē)阀圾。
entity Driver
entity Car
relationship OneToOne {
Car{driver} to Driver{car}
}
一個(gè)單向示例哪廓,其中一個(gè)公民擁有一個(gè)護(hù)照,但該護(hù)照無(wú)權(quán)獨(dú)占其所有者初烘。
entity Citizen
entity Passport
relationship OneToOne {
Citizen{passport} to Passport
}
一對(duì)多
雙向關(guān)系涡真,其中所有者沒(méi)有,一個(gè)或多個(gè)Car對(duì)象肾筐,并且Car知道其所有者哆料。
entity Owner
entity Car
relationship OneToMany {
Owner{car} to Car{owner}
}
JHipster不支持這種關(guān)系的單向版本,但是看起來(lái)像這樣:
entity Owner
entity Car
relationship OneToMany {
Owner{car} to Car
}
多對(duì)一
一對(duì)多關(guān)系的互惠版本與以前相同吗铐。汽車(chē)認(rèn)識(shí)車(chē)主的單向版本:
entity Owner
entity Car
relationship ManyToOne {
Car{owner} to Owner
}
多對(duì)多
最后东亦,在此示例中,我們的Car知道其駕駛員唬渗,并且Driver對(duì)象可以訪問(wèn)其汽車(chē)典阵。
entity Driver
entity Car
relationship ManyToMany {
Car{driver} to Driver{car}
}
請(qǐng)注意,關(guān)系的擁有方必須在左側(cè)
常數(shù)
從JHipster Core v1.2.7開(kāi)始镊逝,JDL支持?jǐn)?shù)字常量壮啊。這是一個(gè)例子:
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 | 卡桑德拉 | 驗(yàn)證方式 |
| 串 | 串 | 串 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小長(zhǎng)度撑蒜,最大長(zhǎng)度歹啼,模式</dfn> |
| 整數(shù) | 整數(shù) | 整數(shù) | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需,最小座菠,最大</dfn> |
| 長(zhǎng) | 長(zhǎng) | 長(zhǎng) | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需狸眼,最小,最大</dfn> |
| 大十進(jìn)制 | 大十進(jìn)制 | 大十進(jìn)制 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">所需浴滴,最小拓萌,最大</dfn> |
| 浮動(dòng) | 浮動(dòng) | 浮動(dòng) | <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> |
| 斑點(diǎn) | 斑點(diǎn) | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需降宅,最小字節(jié)骂远,最大字節(jié)</dfn> |
| AnyBlob | AnyBlob | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需,最小字節(jié)腰根,最大字節(jié)</dfn> |
| ImageBlob | ImageBlob | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需激才,最小字節(jié),最大字節(jié)</dfn> |
| TextBlob | TextBlob | | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">必需额嘿,最小字節(jié)瘸恼,最大字節(jié)</dfn> |
| 瞬間 | 瞬間 | 瞬間 | <dfn style="box-sizing: border-box; outline: none; font-style: italic;">需要</dfn> |
可用選項(xiàng)
一元期權(quán)
這些選項(xiàng)沒(méi)有任何價(jià)值:
skipClient
skipServer
noFluentMethod
filter
它們可以這樣使用: <OPTION> <ENTITIES | * | all> except? <ENTITIES>
二元期權(quán)
這些選項(xiàng)采用以下值:
-
dto
(mapstruct
) -
service
(serviceClass
,serviceImpl
) -
paginate
(pager
册养,pagination
东帅,infinite-scroll
) -
search
(elasticsearch
) -
microservice
(自定義值) -
angularSuffix
(自定義值)
問(wèn)題與錯(cuò)誤
JDL 在GitHub上可用,并遵循與JHipster相同的貢獻(xiàn)準(zhǔn)則球拦。
請(qǐng)使用我們的項(xiàng)目提交有關(guān)庫(kù)本身的問(wèn)題和請(qǐng)求請(qǐng)求靠闭。
提交任何內(nèi)容時(shí),您都必須盡可能精確:
- 一個(gè)已發(fā)布的問(wèn)題只能有一個(gè)問(wèn)題(或一個(gè)需求/問(wèn)題)坎炼;
- 拉請(qǐng)求是受歡迎的愧膀,但是提交必須是“原子的”才能真正理解。