Hibernate ORM 6.0 的第一个 Beta 版本刚刚发布。

对于这个 Beta 版本,我们有一些主要目标

迁移到 Jakarta Persistence

Jakarta Persistence 正在替代 Java Persistence,随着 Java EE 向 Jakarta EE 过渡。有关详细信息,请参阅此博客

对于用户来说,这意味着从 javax.persistence 命名空间迁移到 jakarta.persistence。这会影响包/类名称以及设置/提示名称。有一些工具可以帮助进行此迁移。

至少在短期内,Hibernate 旨在同时支持这两套设置和提示名称。

类型系统

6.0 中的类型系统一直在演进,以适应新的按位置读取 JDBC 结果的方法。由于这些契约正在发生变化,并且这是一个主要版本,因此我们利用这个机会改进了类型系统,这将对用户产生影响。主要变化是删除了使用 BasicType 合约编写自定义类型的能力。所有自定义类型现在都基于 UserType 合约。

在未来的 6.0 Beta 版本中,我们还将弃用各种 BasicType 实现。依赖于这些特定类的应用程序应开始迁移到替代方案。

在这个 Beta 版本中,仅支持自定义基本类型。

新的自定义复合类型合约仍在讨论中。

新的自定义集合类型合约将基于 CollectionSemantics 合约,尽管如何最好地公开这一点仍在讨论中

计划在下一个 Beta 版本中添加对自定义复合类型和自定义集合类型的支持。

类型注解

有新的注解用于应用这些新合约。总的来说,所有基于 String 的类型规范注解都已删除。这是 Hibernate 首次添加注解支持时的一个糟糕选择 - 它只是将 XML 作为注解公开。具体的更改包括删除

  • @Type

  • @TypeDef / @TypeDefs

  • @MapKeyType

  • @AnyMetaDef / @AnyMetaDefs

  • @CollectionId#type

此外,@ParamDef#type 将在下一个测试版中被替换。

用户指南中对新的注解进行了很好的介绍。请特别查看《域模型》章节中的 基本类型@Any映射 部分。

值得注意的是,可以使用这些新的注解作为元注解。请查看 @Any映射 部分中关于用 @AnyMetaDef 替代的示例。

时区支持

Hibernate的前几个版本在存储时区信息时使用了一个“规范化”方案;在写入数据库之前,基于时区的值会被规范化为UTC。虽然这是一种通常最佳的做法,但一些用户可能更喜欢使用其他策略,例如使用 WITH TIMEZONE SQL数据类型的变体。为此,Hibernate添加了TimeZoneStorageType枚举来指定如何处理时区细节。此策略可以通过使用hibernate.timezone.default_storage设置在SessionFactory级别指定,或通过使用@TimeZoneStorage注解在属性级别指定。TimeZoneStorageType定义了以下策略

NORMALIZE

(默认)在写入前将Hibernate的传统行为规范化为UTC

NATIVE

依赖底层数据库的WITH TIMEZONE支持。如果数据库没有本地支持WITH TIMEZONE(如SQL规范所预期),则抛出异常。这一点很重要,因为它排除了定义了WITH TIMEZONE但实际上不存储时区的数据库(例如PostgreSQL)。

COLUMN

使用单独的列来存储时区。这会将值拆分为两个列,我们预计会有各种限制。注意,此策略尚未实现。

过程调用

通过Jakarta Persistence和Hibernate原生API实现了对过程调用的支持。

一个突出的问题,实际上是一个改进,与结果集映射有关。

稳定API

这是一个测试版,所以尽管我们将尽量减少API的变化(除了尚未实现的功能,见下文),但仍然可能有一些小的变化。但一般来说,用户可以将API视为稳定的。

待办事项

还有一些事情我们需要实现或修复。这不是一个全面的列表,但是我们已知不工作的事情的一个很好的开始。

  1. 自定义复合类型(见上文)

  2. 自定义集合类型(见上文)

  3. 缓存提供者 - 从5.x版本开始,Hibernate只支持通过JCache规范的可插拔缓存实现。`hibernate-jcache`模块使用Ehcache(作为JCache实现)进行测试。遗憾的是,Ehcache定义了一个依赖于Java EE的依赖项,这与Hibernate迁移到Jakarta EE相冲突。由于我们无法测试该模块,我们没有将其作为此测试版的一部分发布。我们将监视情况,并希望很快重新启用此模块。

  4. 统计信息 - 并非所有统计信息都已经被重新连接。

  5. Gradle插件。Gradle的插件发布插件在尝试发布此测试版时给我们带来了问题。因此,为了发布Beta1,我们将暂时禁用发布此插件,直到这个问题得到解决。

我们知道这些不工作,因此不需要为这些创建Jira问题。

更多信息

请参阅用户指南迁移指南

还可以查看发布页面

要联系我们,请使用之前讨论过的常规渠道https://hibernate.com.cn/community/


返回顶部