美文网首页
jhipster使用jdl生成微服务和实体

jhipster使用jdl生成微服务和实体

作者: RickChan | 来源:发表于2019-10-08 14:14 被阅读0次

    仅适用于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文档:

    1. JDL示例
    2. 如何使用它
    3. 语言
      3.1 实体声明
      3.2 关系声明
      3.3 枚举
      3.4 斑点
      3.5 选项声明
      3.6 与微服务相关的选项
    4. 评论
    5. 所有关系
    6. 常数
    7. 附件
      7.1 可用类型和约束
      7.2 可用选项
    8. 问题与错误

    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.jdljhipster-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
    
    

    关键字dtopaginateservicewith加入到语法来支持这些变化。如果指定了错误的选项,那么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>

    二元期权

    这些选项采用以下值:

    • dtomapstruct
    • serviceserviceClassserviceImpl
    • paginatepagerpaginationinfinite-scroll
    • searchelasticsearch
    • microservice (自定义值)
    • angularSuffix (自定义值)

    问题与错误

    JDL 在GitHub上可用,并遵循与JHipster相同的贡献准则

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

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

    • 一个已发布的问题只能有一个问题(或一个需求/问题);
    • 拉请求是受欢迎的,但是提交必须是“原子的”才能真正理解。

    相关文章

      网友评论

          本文标题:jhipster使用jdl生成微服务和实体

          本文链接:https://www.haomeiwen.com/subject/hmebpctx.html