创建一个实体 Creating an entity
请查看我们的 video tutorial 创建一个新的JHipster应用程序!
重要 如果您想要“实时重新加载”您的JavaScript / TypeScript代码,则需要运行 gulp
(对于JavaScript / AngularJS 1) 或 yarn start
(对于TypeScript / Angular 2+). 您可以 Using JHipster in development 页面中获取更多信息。
介绍 Introduction
创建应用程序后,您将需要创建 实体。例如, 你可以创建一个 Author 和 Book 实体. 对于每个实体, 你需要:
- 数据库表
- 一个Liquibase变更集
- JPA实体
- 一个Spring数据JPA存储库
- 一个Spring MVC REST控制器,具有基本的CRUD操作
- 一个 Angular 路由器, 组件和服务
- HTML视图
- Integration tests, 集成测试,以验证一切正常工作
- Performance tests, 看是否一切顺利
如果您有几个实体,您可能希望在它们之间建立关系。为此,您将需要:
- 数据库外键
用于管理此关系的特定JavaScript和HTML代码
"entity" 子生成器将创建所有必需的文件,并为每个实体提供一个CRUD前端 (参见 project structure). 子生成器可以通过运行调用
jhipster entity <entityName> --[options]
. 通过键入可以找到这些选项的参考jhipster entity --help
以下是支持的选项。
--table-name <table_name>
- 默认情况下,JHipster将根据您的实体名称生成一个表名,如果您希望拥有不同的表名,可以传递此选项。--angular-suffix <suffix>
- 如果您希望所有Angular 路由都有自定义后缀,您可以使用此选项传递。--regenerate
- 这将重新生成一个现有的实体,而不会提出任何问题。--skip-server
- 这将跳过服务器端代码,并且只会生成客户端代码。--skip-client
- 这将跳过客户端代码,并将仅生成服务器端代码。--db
- 在跳过服务器端生成时指定数据库,否则不起作用。
JHipster UML和JDL Studio
本页介绍如何使用标准命令行界面创建具有JHipster的实体。如果要创建多个实体,则可能更喜欢使用图形工具。
在这种情况下,有两个选项可用:
- JHipster UML, 它允许您使用UML编辑器。
- JDL Studio, 我们的在线工具,使用我们的域专用语言 JDL创建实体和关系。
如果您使用JDL Studio:
- 你可以用
import-jdl
子生成程序生成JDL文件,通过运行jhipster import-jdl your-jdl-file.jh
命令 把JDL文件生成实体。- 如果您不想重新生成实体,则在导入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
- 如果您不想重新生成实体,则在导入JDL时,可以使用该
- 如果要使用JHipster UML而不是import-jdl子生成器,则需要运行安装它
npm install -g jhipster-uml
,然后运行jhipster-uml yourFileName.jh
。
实体字段 Entity fields
对于每个实体,您可以根据需要添加任意数量的字段。您将需要输入字段名称及其类型,JHipster将为您生成所有必需的代码和配置,从Angular HTML视图到Liquibase更改日志。
这些字段在您使用的技术中不能包含保留关键字。例如,如果你使用MySQL:
- 您不能使用Java保留关键字(因为您的代码将无法编译)
- 您不能使用MySQL保留关键字(因为您的数据库模式更新将失败)
字段类型 Field types
JHipster支持许多字段类型。这种支持取决于您的数据库后端,因此我们使用Java类型来描述它们:Java String
将以不同的方式存储在 Oracle 或 Cassandra, 它是JHipster为您生成正确的数据库访问代码的优势之一。
String
: Java字符串。它的默认大小取决于底层后端(如果使用JPA,默认max
值为255),但是可以使用验证规则(例如放大小1024)进行更改Integer
: A Java Integer.Long
: A Java Long.Float
: A Java Float.Double
: A Java Double.BigDecimal
: A java.math.BigDecimal object, 用于当您想要精确的数学计算(通常用于财务操作)。LocalDate
: A java.time.LocalDate object, 用于正确管理Java中的日期。Instant
: A java.time.Instant object, 用于表示时间戳,即时间线上的瞬时点。ZonedDateTime
: A java.time.ZonedDateTime object, 用于表示给定时区中的本地日期时间(通常为日历约会)。请注意,时区不是REST支持的,也不是持久层,所以你应该最有可能使用Instant
.Boolean
: A Java Boolean.Enumeration
: Java枚举对象。当选择此类型时,子生成器会询问您在枚举中需要什么值,并创建一个特定的enum
类来存储它们.Blob
: 一个Blob对象,用于存储一些二进制数据。当选择此类型时,子生成器将询问您是否要存储通用二进制数据,图像对象或CLOB(长文本)。图像将专门在角度处理,因此它们可以显示给最终用户。
验证 Validation
可以为每个字段设置验证。根据字段类型,将提供不同的验证选项。
验证将自动生成于:
- HTML视图,使用 the AngularJS validation mechanism
- Java域对象,使用 Bean Validation
然后,Bean验证将用于在域对象使用时自动验证:
- Spring MVC REST控制器(使用
@Valid
注释) - Hibernate / JPA(实体在保存之前自动验证)
验证信息还将用于生成更精确的数据库列元数据:
- 必填字段将被标记为不可为空
- 具有最大长度的字段将具有相同的列长度
验证有一些限制:
- 我们不支持AngularJS和Bean验证的所有验证选项,因为我们只支持这两种API通用的验证选项
- 正则表达式模式在JavaScript和Java中不起作用,因此,如果您配置一个表单模式,则可能需要调整生成的模式之一
- JHipster生成可用于通用实体的单元测试,而不知道您的验证规则:生成的测试可能未通过验证规则。在这种情况下,您将需要更新单元测试中使用的示例值,以便它们通过验证规则。
实体关系 Entity relationships
实体关系仅适用于SQL数据库。这是一个相当复杂的主题,它有自己的文档页面: Managing relationships.
数据传输对象(DTO) Data Transfer Objects (DTOs)
默认情况下,JHipster实体不使用DTO,但它们作为选项可用。以下是文档: Using DTOs.
分页 Pagination
请注意,如果您使用 Cassandra.创建了应用程序,则无法进行分页。当然这将在以后的版本中添加。
分页使用 the Link header, 如 GitHub API. JHipster在服务器(Spring MVC REST)和客户端(AngularJS)两方面提供了本规范的自定义实现。 当生成实体时,JHipster提供4个分页选项:
- 没有分页(在这种情况下,后端不会被分页)
- 一个简单的寻呼机,基于the Bootstrap pager
- 一个完整的分页系统,基于the Bootstrap pagination component
- 无限滚动系统,基于 the infinite scroll directive
更新现有实体 Updating an existing entity
实体配置保存在目录中的特定 .json
文件, 在 .jhipster
目录中. 因此,如果再次运行子生成器,则使用现有实体名称,可以更新或重新生成实体。
当您为现有实体运行实体子生成器时,将会询问您是否要更新实体?这将替换此实体的现有文件,所有您的自定义代码将被覆盖“具有以下选项:
Yes, re generate the entity
- 这只会重新生成您的实体。提示: 运行子生成器时可以通过传递--regenerate
标志来强制执行此操作 。Yes, add more fields and relationships
- 这将给您提供更多的领域和关系的问题Yes, remove fields and relationships
- 这将提供您从实体中删除现有字段和关系的问题No, exit
- 这将存在子生成器而不改变任何东西
您可能需要更新您的实体,原因如下:
- 您想要添加/删除现有实体的字段和关系
- 您要将实体代码重置为原始状态
- 您已更新JHipster,并希望通过新模板生成实体
- 您已修改
.json
配置文件(格式与生成器提出的问题非常接近,因此不是很复杂),因此您可以拥有一个新版本的实体 - 您有复制/粘贴该
.json
文件,并希望一个非常接近复制实体的新实体
提示: 一次重新生成所有实体,您可以使用以下命令 (remove the --force
to have questions asked when files have changed).
- Linux & Mac:
for f in `ls .jhipster`; do jhipster entity ${f%.*} --force ; done
- Windows:
for %f in (.jhipster/*) do jhipster entity %~nf --force
教程 Tutorial
这是一个简短的教程,用于创建两个具有一对多关系的实体 (a Author and a Book) 。
重要 如果您想要“实时重新加载”您的JavaScript / TypeScript代码,则需要运行 gulp
(for JavaScript/AngularJS 1) 或 yarn start
(for TypeScript/Angular 2+). 您可以在Using JHipster in development 页面中使用JHipster了解更多信息。
生成“作者”实体 Generate the "Author" entity
因为我们希望在作者和书籍之间有一对多的关系(一个作者可以写很多书),我们需要先创建作者。在数据库级别,JHipster将能够在Book表上添加一个外键,链接到作者表。
jhipster entity author
回答有关这个实体领域的下一个问题,作者有:
- a "name" of type "String"
- a "birthDate" of type "LocalDate"
然后回答有关关系的问题,作者有:
- A one-to-many relationship with the "book" entity (which doesn't exist yet)
生成“书”实体 Generate the "Book" entity
jhipster entity book
回答有关这个实体领域的下一个问题,这本书有:
- a "title", of type "String"
- a "description", of type "String"
- a "publicationDate", of type "LocalDate"
- a "price", of type "BigDecimal"
然后回答有关关系的问题,书:
- Has many-to-one relationship with the "author" entity
- And this relationship uses the "name" field (from the Author entity) to be displayed
检查生成的代码
运行生成的测试套件, mvn test
, 它将测试作者实体和Book实体。
启动应用程序(例如使 mvn
), 登录并在“实体”菜单中选择“作者”和“预订”实体。
检查数据库表,查看您的数据是否正确插入。
改善生成的代码 Improve the generated code
生成的文件包含所有基本的CRUD操作,如果需要简单,则不需要修改它们。
如果要修改生成的代码或数据库模式,则应遵循我们的 development guide
如果您想要更复杂的业务行为,则可能需要 @Service
使用 service sub-generator.
你完成了!
您生成的CRUD页面应如下所示: