最近更新
本章节包含 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 设计器

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

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

Liquibase 更改日志
-
Studio 能在 Jmix 工具窗口的数据存储节点展示已有的 Liquibase 更改日志文件:
-
可以使用 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。
兼容 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);
在之前的版本中,虽然也隐式支持级联保存关联实例,但是并非支持框架的完整处理机制。现在下列功能在级联保存时提供完整支持:
角色管理改进
资源和行级角色的界面有了新的改进:
-
管理和为用户分配角色时,支持通过名称、编码、源(注解类/数据库)对角色过滤。
-
导入导出操作,支持在不同的应用程序之间共享角色配置。
-
行级策略编辑器现在提供对 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.NotInstantiatedList
和 io.jmix.data.impl.lazyloading.NotInstantiatedSet
集合初始化的字段,而非 mutableListOf()
、mutableSetOf()
或其他标准集合。示例:
@Composition
@OneToMany(mappedBy = "foo")
var bars: List<Bar> = NotInstantiatedList()
使用这些特殊的集合能保证正确地对属性进行懒加载。
选择器组件中的输入提示
ValuePicker、ValuesPicker 和 EntityPicker 组件现在添加了 inputPrompt
属性。
过滤器时间条件
过滤器日期条件 现在增加了 Year 选项。
预览功能
破坏性改动
CORS 配置
请使用新的 jmix.cors.allowed-origins 属性替换 jmix.rest.allowed-origins
。如果之前你配置过该属性,只需要重名民即可。Studio 的自动迁移程序也会帮你修改。
另外,也可以使用该版本中引入的其他 CORS 属性 调整 CORS 设置。