简介
Jhipster是一个全栈的快速开发平台, 后端为Springboot项目, 前端可选择Angular, VUE或者React
安装基础环境
Java好像必须要jdk11以上, 可以直接下载jdk17
2. 安装JHipster
npm install -g generator-jhipster
初始化项目
3. 创建一个新目录并进入
mkdir myApp && cd myApp
4. 运行Jhipster并根据屏幕指示操作
jhipster
Q: 想创建哪种类型的项目
A: 普通Java项目, 网关项目, 微服务项目, 这边就先选择第一个普通的项目。
Q: 项目名称
A: 随便
Q: 是否要创建响应式的Spring WebFlus项目?
A: 老老实实用SpringMVC吧, webflux还不太成熟, 与其他异步IO框架整合不是太好
Q: java的package包名
A: 按实际填写
Q: 使用什么认证授权技术?
A: JWT, OAUTH或者普通的Cookie/Session, 按实际选择
Q: 喜欢用什么数据库?
A: 感觉像调研问题一样, 按实际选择
Q: 在生产环境中使用的数据库类型
A: 按实际选择
Q: 在开发环境中使用的数据库类型
A: 按实际选择
Q: 使用什么缓存框架
A: 按实际选择
Q: 是否要开启hibernate二级缓存
A: 按实际选择
Q: 使用maven还是grandle管理项目
A: 按喜好选择
Q: 使用jhipster注册中心什么东西的没看明白
A: 默认no
Q: 还想使用什么别的技术吗
A: 按实际选择
Q: 使用什么前端框架
A: 按实际选择
Q: 是否生成admin管理端的代码
A: y
Q: 选择一个前端项目的风格
A: 可以参考那个网站
Q: 是否开启国际化支持
A: 按实际选择
Q: 选择你的家乡话
A: 按实际选择
Q: 除了那俩玩意你还想用什么测试框架
A: 那俩玩意也不想用 全删了最好
Q: 你还想用别的生成框架吗
A: 下次吧
JDL文件设计
使用 JDL Studio 设计您的实体类后, 下载
jhipster-jdl.jh
文件 (jdl文件和jh文件是一样的)JDL所有语法参考这里: https://www.jhipster.tech/cn/jdl/
示例配置可以参考JDL Studio里的默认配置, 这边给出一个我喜欢的CURD的简单的配置
entity SysCom(SYS_COM) { /** 主键 */ id Long /** 头像 */ avatar String /** 姓名 */ name String required } // 设置无限滚动 // paginate xxx with infinite-scroll // 所有实体类全都生成分页 paginate * with pagination // 所有controller全部直接调用Service类 service * with serviceClass
生成实体类代码/按个人喜好修改配置
生成实体类代码
jhipster jdl jhipster-jdl.jh
application-dev.yml修改数据库连接配置
关闭liquibase, 开启jpa自动更新表结构:
application.yml中dev这个group增加一个配置 -
-no-liquibase
application.yml中ddl-auto改为update
增加jackson序列化反序列化相关配置:
jackson: locale: zh time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss deserialization: # json字符串中有不存在的属性时失败 fail_on_unknown_properties: false parser: # 允许出现特殊字符和转义符 allow_unquoted_control_chars: true # 允许出现单引号 allow_single_quotes: true
更改JPA时区配置:
hibernate.jdbc.time_zone: GMT+8
pom.xml中profile配置默认开启了两个, 一个是dev, 一个是webapp, (
activeByDefault
标签, 打包的时候按需求开启然后就可以按普通springboot项目一样启动了~
附录1: JDL相关说明
关于实体:
声明语法如下:
[<entity javadoc>] [<entity annotation>*] entity <entity name> [(<table name>)] { [<field javadoc>] [<field annotation>*] <field name> <field type> [<validation>*] } 必选项: <entity name> 实体名称, <field name> 实体属性名称, <field type> JHipster支持的属性类型, 可选项: <entity javadoc> 实体描述, <entity annotation> 实体的选项(有关可用选项的完整列表,请参见选项), <table name> 数据库表名称(如果要指定与实体名称自动转换不同的名称), <field javadoc> 属性描述, <field annotation> 属性的选项, <validation> 属性的校验规则。 简单栗子: /** * 这是关于实体类的注释 * @author 作者名称 */ @dto(mapstruct) // 使用mapstruct生成dto @search(elastisearch) // 使用es进行搜索 @service(serviceClass) // 直接生成service类 不使用service接口 entity SysUser(SYS_USER) { // entity是用来声明实体的关键字 SysUser是实体类的名称 SYS_USER是表名称 /** * This comment will also be used! * @type... */ id UUID required // id字段每个实体类都会默认添加, 默认为Long类型, 如果想改变id的类型, 必须要显式声明一下 age Integer min(32) max(32) }
以下是JDL支持的所有字段类型和校验规则
JDL类型 | 校验规则 |
String | required, minlength, maxlength, pattern, unique |
Integer | required, min, max, unique |
Long | required, min, max, unique |
BigDecimal | required, min, max, unique |
Float | required, min, max, unique |
Double | required, min, max, unique |
Enum | required, unique |
Boolean | required, unique |
LocalDate | required, unique |
ZonedDateTime | required, unique |
Instant | required, unique |
Duration | required, unique |
UUID | required, unique |
Blob | required, minbytes, maxbytes, unique |
AnyBlob | required, minbytes, maxbytes, unique |
ImageBlob | required, minbytes, maxbytes, unique |
TextBlob | required, unique |
以下是JDL支持的所有实体选项
JDL 选项名称 | 选项类型 | 默认值 | 可选值 | 说明 |
skipClient | unary | false | ㅤ | 这将使前端代码生成被跳过 |
skipServer | unary | false | ㅤ | 这将使服务器代码生成被跳过 |
noFluentMethod | unary | false | ㅤ | 查看说明 了解更详细内容 |
filter | unary | false | ㅤ | 查看过滤 了解更多详细内容;如果设置为true,但未设置`service`,则将使用`serviceClass` |
readOnly | unary | false | ㅤ | 添加此选项将使实体变为只读, 查看 发布日志 进一步了解。 |
dto | binary | no | mapstruct, no | 是否为您的实体创建DTO,如果实体具有DTO但没有`service`,则将使用`serviceClass` |
service | binary | no | serviceClass, serviceImpl, no | ㅤ |
paginate | binary | no | pagination, infinite-scroll, no | 当应用程序使用Cassandra时,禁止分页 |
search | binary | no | elasticsearch, no | 要求应用程序启用searchEngine选项 |
microservice | binary | ㅤ | custom value | 将为微服务应用程序内声明的每个实体自动添加 |
angularSuffix | binary | ㅤ | custom value | ㅤ |
clientRootFolder | binary | ㅤ | custom value | ㅤ |
关于关联关系:
声明语法如下:
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 引入的关系属性是否不能为空。 with jpaDerivedIdentifier 或 @MapsId 用于关联关系 (仅适用于一对一(one-to-one) 简单栗子: relationship ManyToMany { SysJob{sysTask(name) required} to SysTask{sysJob(title)} } 上面关系的意思为, 一个SysJob实体对应着多个SysTask实体, required 表示每个SysJob必须最少有一个SysTask, 在SysJob实体类中SysTask集合的字段名为sysTask(会自动处理复数名称), 在前端选项列表里展示的SysTask的字段名称为name, 同时另一端SysTask也对应着多个SysJob实体, 在SysTask实体类中的SysJob集合的字段名为sysTask(会自动处理复数名称), 在前端选项列表里展示的SysJob的字段名称为title,
看中文官方文档不要相信这段鬼话:
英文文档中根本没有这一段话, 应该是翻译的时候自己加上去的, 这里理解有误, 小括号中的name只是前端选项列表里展示的字段, 并不是指定与哪一列连接, 连接列默认就是id, 并且好像不可更改
贴一个回答在这: https://stackoverflow.com/questions/41111153/jhipster-relationship-join-with-another-field-not-id
附录2: 关于关联关系生成的代码
OneToMany:
@ManyToOne @JsonIgnoreProperties(value = { "sysStudents" }, allowSetters = true) private SysClass sysClass; @OneToMany(mappedBy = "sysClass") @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @JsonIgnoreProperties(value = { "sysClass" }, allowSetters = true) private Set<SysStudent> sysStudents = new HashSet<>();
关于 一对多/多对一 关系的说明(@JoinColumn and mappedBy):
上面这个例子中没有使用@JoinColumn注解, 不使用 @JoinColumn,Hibernate 会自动在表中生成关联字段,字段默认的命名规则为 “附属类名_附属主键”,如:password_id
mappedBy表示根据另一方的哪个字段来获取关联实体集合.
@JsonIgnoreProperties的value表示在字段所属的实体类里面忽略掉哪几个属性
@JsonIgnoreProperties的allowSetters = true表示允许反序列化
OneToOne和ManyToOne默认立即加载, OneToMany和ManyToMany默认懒加载, 可以使用
open-in-view: false
简单来说就是在Controller层里面获取不到懒加载的字段, 所以要获取懒加载字段要在service层获取.后记: 还有很多东西以后慢慢研究…