最近更新

本章节包含 Jmix 框架和 Studio 1.3 的新功能介绍,以及在升级框架版本时需要注意的一些破坏性改动。

如何升级

如需新建 Jmix 1.3 项目或者升级已有项目,需要使用 Studio 1.3 以上版本。因此,先 升级 Jmix Studio 插件。

参阅 升级项目 部分的介绍了解如何使用 Studio 升级项目。自动升级迁移过程会对项目做如下修改:

  • 升级 Jmix BOM 的版本,BOM 又定义了所有依赖的版本。

  • 升级 Jmix Gradle 插件的版本。

  • 升级 Gradle wrapper 的版本至 7.4.2,修改 gradle/wrapper/gradle-wrapper.properties 文件。

  • jmix.rest.allowed-origins 应用程序属性重命名为 jmix.cors.allowed-origins(参阅 下面内容)。

新功能和改进

JPQL 设计器

jpql designer

Studio 中的 JPQL 设计器现在可以用来编辑已有的查询语句。当在 Component Inspector 工具窗口点击数据容器的 query 属性时会自动打开:

jpql from comp insp

也可以通过装订线栏的图标为代码中的语句打开设计器:

jpql from code

此功能需要快速开发版或企业版 订阅。如果没有订阅,请尝试 试用版

Liquibase 更改日志

  • Studio 能在 Jmix 工具窗口的数据存储节点展示已有的 Liquibase 更改日志文件:

    lbcl jtw
  • 可以使用 Jmix 工具窗口的 New → Advanced → Liquibase Changelog…​ 操作创建新的空更改日志文件。Studio 将推荐一个文件名,并创建一个带 XML 根节点的文件。可以打开该文件,并通过代码自动完成的帮助手动添加变更集。

  • 自动和手动创建的新更改日志的文件名现在包含 HHmmss 格式的时间戳(而不是以前添加的序号 010、020…​)。能避免切换 VCS 分支时的重复更改日志。

    如果要恢复为连续数字编号,打开 Navigate → Search Everywhere(或按 Shift 两次),然后输入“jmix features”。在 Jmix Features 对话框中,禁用 Use timestamp in changelog names 选项。

  • 对于自动生成的更改日志,Studio 支持在保存和执行更改日志之前,在 Changelog Preview 窗口中更改文件名和路径。

  • Studio 现在可以防止意外删除重要的更改日志。如果在已删除的文件中找到 <!-- DO NOT REMOVE. some explanation --> 注释,则会显示一个对话框,建议恢复该文件。主更改日志和初始化 User 表和数据的更改日志受此类注释的保护。

热部署

  • 现在可以在 Studio 调试控制台看到关于热部署的信息,例如:

    Hot deploy: CustomerBrowse.java [618 ms]
    Compiled files:
        com/company/demo/screen/customer/CustomerBrowse.java
  • 如果你使用了其他重加载代码的技术,例如 JRebel,可以在 IDE 的设置中关掉热部署:Languages & Frameworks → Jmix → Project Settings → Enable hot deploy

BPM 改进

  • Studio 中的 BPMN 设计器 有了很大的提升,现在其功能与运行时的设计器差不多了。

  • 多租户 功能支持用户组、流程定义、流程实例以及 DMN 相关的表。

  • 用户任务表单的标题现在不包含任何 “领取 % 任务” 或 “完成 % 任务” 的内容。如果用户任务有名称,则直接在表单中使用该名称。如果没名称,则使用任务标识符。

  • 支持 BigDecimal 类型的流程变量。

  • 如果项目包含了 动态属性 扩展组件,则 实体数据 任务可以支持设置和更新动态属性值。

  • 任务的本地变量在流程实例编辑器中展示。

兼容 Elasticsearch 8.1

搜索扩展组件现在使用 Elasticsearch 8.1。

默认情况下该扩展组件配置使用 Elasticsearch 7.11 及以上版本。如果你需要使用 7.11 以下版本,请设置 jmix.search.rest-high-level-client-api-compatibility-mode-enabled 应用程序属性的值为 false

支持 JPA Cascade

完全支持 JPA 级联(cascade)操作。下面用示例解释此改进。

假设有两个关联实体:

@Entity
public class Bar {
    // ...
}
@Entity
public class Foo {

    @JoinColumn(name = "BAR_ID")
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Bar bar;
    // ...
}

然后可以创建两个实体的实例但仅保存 Foo 实例。由于使用了 cascade = CascadeType.ALL 注解参数,JPA 会自动保存 Bar 实例:

Foo foo = dataManager.create(Foo.class);
Bar bar = dataManager.create(Bar.class);
foo.setBar(bar);

dataManager.save(foo);

在之前的版本中,虽然也隐式支持级联保存关联实例,但是并非支持框架的完整处理机制。现在下列功能在级联保存时提供完整支持:

DTO 界面模板改进

DTO 实体的界面模板 XML 描述中现在包含了加载器,并在控制器模板中加入了加载和提交的代理方法。这样与外部数据源交互更加容易了。

角色管理改进

资源和行级角色的界面有了新的改进:

  • 管理和为用户分配角色时,支持通过名称、编码、源(注解类/数据库)对角色过滤。

  • 导入导出操作,支持在不同的应用程序之间共享角色配置。

  • 行级策略编辑器现在提供对 JPQL 的代码自动完成功能,以及语法检查和文档链接。

处理唯一性

在这个发行版中,我们调整了 Studio 中对实体唯一性属性的支持。之前,Studio 使用 @Column 注解的 unique = true 属性作为在数据库创建唯一约束的提示信号。而这个约束并不会出现在 @Table(uniqueConstraints) 注解中,因此可能会与实体设计器 Indexes 标签页定义的信息冲突。并且会给人印象是框架能以某种形式自己处理唯一性约束,但实际上 Jmix 一直以来数据库的唯一性约束。

于是我们决定只能有一个清晰的方法用于定义数据的唯一性 - 使用实体设计器的 Indexes 标签设计数据约束。

因此,我们删除了 Studio 的隐藏功能:实体设计器的 Unique 复选框以及在 MySQL 数据库为软删除实体创建的额外非 null 属性和数据库触发器。文档现在包含了关于实现软删除实体唯一约束的详细解释和 建议

其他

导入导出动态属性配置

现在可以导出 动态属性 分类,与其他项目实例共享配置。

悲观锁时限

如果项目包含了 Quartz 扩展组件,则使用 @PessimisticLock 注解定义实体的悲观锁现在会自动过期。可以使用下面的属性自定义锁过期的调度任务:

jmix.core.pessimistic-lock.expiration-cron=0 * * * * ?

如果需要关闭内置的过期调度,设置下列属性值为 false

jmix.core.pessimistic-lock.use-default-quartz-configuration=false

Kotlin 实体中的懒加载

当创建 Kotlin 实体中的集合属性时,Studio 现在会生成使用 io.jmix.data.impl.lazyloading.NotInstantiatedListio.jmix.data.impl.lazyloading.NotInstantiatedSet 集合初始化的字段,而非 mutableListOf()mutableSetOf() 或其他标准集合。示例:

@Composition
@OneToMany(mappedBy = "foo")
var bars: List<Bar> = NotInstantiatedList()

使用这些特殊的集合能保证正确地对属性进行懒加载。

选择器组件中的输入提示

ValuePickerValuesPickerEntityPicker 组件现在添加了 inputPrompt 属性。

过滤器时间条件

过滤器日期条件 现在增加了 Year 选项。

实体探查中批量编辑

实体探查 增加了 批量编辑

REST 错误响应

如果 DeletePolicy.DENY 权限拒绝删除已经软删除的实体,则返回 HTTP 409 (冲突)状态码而非 500。

依赖升级

  • Spring Boot 2.7.0

  • Liquibase 4.11

  • Flowable 6.7.2

预览功能

一键云部署预览

Studio 现在可以将你的应用程序快速部署至 AWS EC2。

该功能目前处于预览阶段,并且默认不开放。如需尝试,打开 Navigate → Search Everywhere(或按下 Shift 两次),并输入 "jmix features"。在 Jmix Features 对话框中启用 One-click cloud deployment 选项。

Flow UI 预览

包含了基于 Vaadin 23 的 UI 模块预览版。如果使用 "Full-Stack Application with Experimental FlowUI" 模板创建新项目可以查看新的界面风格。

FlowUI 模块正在积极开发中,会在 1.3 版本的后续补丁中做出重大改动。在我们声明终版出来之前请不要对兼容性有过多期待。

破坏性改动

必须使用 Java 11 以上

Jmix 1.3 项目必须使用 JDK 11 或 17。

不再支持 Java 8。

CORS 配置

请使用新的 jmix.cors.allowed-origins 属性替换 jmix.rest.allowed-origins。如果之前你配置过该属性,只需要重名民即可。Studio 的自动迁移程序也会帮你修改。

另外,也可以使用该版本中引入的其他 CORS 属性 调整 CORS 设置。

变更日志