7.8. Hibernate 更改
JBoss EAP 8 包括对 Hibernate ORM 6.2 的支持,这是 Java 编程语言的对象关系映射工具。有关 Hibernate ORM 6.2 文档的更多信息,请参阅 Hibernate ORM 6.2。
从 JBoss EAP 7.4 迁移到 JBoss EAP 8.0 时,请参考 Hibernate ORM 版本的特定 Hibernate ORM 迁移文档。
要从 JBoss EAP 7.4 迁移到 JBoss EAP 8,您必须完成以下步骤。
- 从 Hibernate ORM 5.3 迁移到 5.4
- 从 Hibernate ORM 5.4 迁移到 5.5
- 从 Hibernate ORM 5.5 迁移到 5.6
- 从 Hibernate ORM 5.6 迁移到 6.0
- 从 Hibernate ORM 6.0 迁移到 6.1
- 从 Hibernate ORM 6.1 迁移到 6.2
- Hibernate ORM dialects
- 弃用的 Hibernate ORM 类
- 推出 Hibernate ORM 类
- Hibernate ORM 内部
要从 JBoss EAP 和 Hibernate 的旧版本迁移,您必须完成以下步骤。
- 从 Hibernate ORM 4.3 迁移到 Hibernate ORM 5.0
- 从 Hibernate ORM 5.0 迁移到 Hibernate ORM 5.1
- 从 Hibernate ORM 5.1 和 Hibernate ORM 5.2 迁移到 Hibernate ORM 5.3
7.8.1. 从 Hibernate ORM 5.3 迁移到 5.4 复制链接链接已复制到粘贴板!
本节重点介绍从 Hibernate ORM 版本 5.3 迁移到 5.4 时所需的更改。有关 Hibernate ORM 5.3 和 Hibernate ORM 5.4 之间实施的更改的更多信息,请参阅 Hibernate ORM 5.4 迁移指南。
已知的更改
下面描述了从 Hibernate ORM 版本 5.3 迁移到 5.4 时的一些变化。
7.8.1.1. 覆盖延迟身份管理行为 复制链接链接已复制到粘贴板!
-
在 Hibernate 5.3 中,为基于
FlushMode或FlushModeType值的DelayedPostInsertIdentifier行为提供支持,以缩短增强扩展 PersistenceContext支持。不幸的是,此更改中包含了一些问题。 -
在 Hibernate 5.4 中,它决定保留尽可能多的 Hibernate 5.3 行为,并且只为所选用例恢复非常具体的
DelayedPostInsertIdentifier行为。 - 为了让 Hibernate 5.4 更灵活,需要将配置选项用作完全禁用 Hibernate 5.3 行为的临时解决方案,将其还原回 Hibernate 5.2 及更早版本。
7.8.1.2. SQL Server JDBC 驱动程序版本升级到至少 6.1.2 复制链接链接已复制到粘贴板!
由于修复 HHH-12973,您必须将 JDBC 驱动程序版本升级到 6.1.2。因此,在没有关闭数据库连接的情况下,SQL Server JDBC 驱动程序的旧版本无法内省 INFORMATION_SCHEMA.SEQUENCES。
7.8.2. 从 Hibernate ORM 5.4 迁移到 5.5 复制链接链接已复制到粘贴板!
本节重点介绍从 Hibernate ORM 版本 5.4 迁移到 5.5 时所需的更改。有关 Hibernate ORM 5.4 和 Hibernate ORM 5.5 之间实施的更改的更多信息,请参阅 Hibernate ORM 5.5 迁移指南。
已知的更改
Hibernate ORM 5.5 版本与 Hibernate ORM 5.4 类似,因为它包括应用到 5.4 维护版本的所有 bug 修复,并引入对 Jakarta Persistence API 的支持。
7.8.2.1. 基于 Dom4J 的 XML 映射 复制链接链接已复制到粘贴板!
Hibernate 的 XML 映射定义的实施基于 JAXB 而不是 DOM4J 进行重组,以确保删除此依赖的持续进度。
7.8.2.2. 删除了禁用 "enhanced 代理" 的功能 复制链接链接已复制到粘贴板!
"增强型代理"功能已作为 Hibernate 5.3 的可选性能改进功能。此功能现已永久启用。
7.8.3. 从 Hibernate ORM 5.5 迁移到 5.6 复制链接链接已复制到粘贴板!
本节重点介绍从 Hibernate ORM 版本 5.5 迁移到 5.6 时所需的更改。有关 Hibernate ORM 5.5 和 Hibernate ORM 5.6 之间实施的更改的更多信息,请参阅 Hibernate ORM 5.6 迁移指南。
已弃用的功能
Hibernate 5.6 版本与之前的 Hibernate 5.5 版本非常相似,但从之前的 Hibernate 版本中删除一些已弃用的功能除外。
7.8.3.1. 删除 Javassist 复制链接链接已复制到粘贴板!
您无法选择 javassist 作为用于实体字节代码增强的实施。byte Buddy 是默认值,在一段时间后,javassist 已被弃用,现在被删除。这对应用程序没有任何功能影响;唯一的例外是,它不再可用于配置 hibernate.bytecode.provider=javassist 属性。如果您使用这个 feautre,可以删除此属性。这可能导致 Hibenate ORM 不再在其依赖项中列出 javassist 的问题。
7.8.4. 从 Hibernate ORM 5.6 迁移到 6.0 复制链接链接已复制到粘贴板!
本节重点介绍从 Hibernate ORM 版本 5.6 迁移到 6.0 时所需的更改。有关 Hibernate ORM 5.6 和 Hibernate ORM 6.0 之间实施的更改的更多信息,请参阅 Hibernate ORM 6.0 迁移指南。
Hibernate 6.0 发行版本包括以下更改:
- Java 11 是 Hibernate 6.0 的最低兼容基准版本。
-
Jakarta Persistence:Hibernate ORM 6.0 发行版中的另一项重要更改包括从 Java Persistence (如 Java EE specs 定义)移到 Jakarta Persistence,如 Jakarta EE spec 定义。此更改产生的最重要的影响包括使用 Jakarata Persistence 类
jakarta.persistence prerequisites而不是 Java Persistence onesjavax.persistence prerequisites。 - 从 JDBC 读取: Hibernate ORM 6.0 版本开发的另一个原因是从 JDBC ResultSet 中按名称(read-by-name)读取结果的另一方面,以根据位置(读取)读取结果。进行了此更改,通过实施吞吐量测试来提高扩展。
生成的 SQL:此功能会导致以下改进:
- 不再生成列别名
- 列引用是"unique-d"。
- 更好地定义并更好地确定不必要的加入(次要表、继承表)
-
标识符为 Object - 早期版本的 Hibernate 需要所有标识符类型都实现
Serializable,Hibernate 6.0 已被删除,因为标识符可以是任何对象。这个更改会影响之前使用Serializable定义的许多 API 和 SPI 方法。 -
@IdGeneratorType:在这个发行版本中,您可以使用
@IdGeneratorType注释来获得更好的 type-safe 方法来定义标识符生成的自定义生成器。 -
隐式标识符序列和表名称 :在 Hibernate 6.0 中修改了与标识符生成关联的序列和表的隐式名称,这可能会影响用户迁移应用程序。在本发行版本中,Hibernate 会为每个实体层次结构创建一个序列,而不是默认单个序列
hibernate_sequence。 -
隐式序列生成器的默认值:Implicit 序列,如前面
hibernate_sequence,现在遵循 JPA@SequenceGenerator注释的默认值,这意味着序列的分配大小为 50。 - 类型 system: 因为 Hibernate 6.0 是一个主要版本,另一个重要的改变是修改 Hibernate 的映射注解,并使它们更适合类型安全。这个功能已决定在此发行版本中提供,因为与类型相关的合同已更改。
-
query:在 Query 的功能中引入了很多更改。查询功能,如迁移到专用树结构以模型 HQL 和标准查询,改进了批量 SQM DML 语句(如 insert、update 和 delete)的实现,以及更改
hibernate.criteria.copy_tree属性的行为,并包括了传递令牌。 -
方法的签名更改:AonSave 方法的签名已从保存#onSave(Object 实体,改为Serializableid, Object[] state, String[] propertyNames, String[] type)boolean onSave (Object entity, Object id, Object[] state, String[] propertyNames, Type[] type),将预期标识符类型从 Serializ 改为Object。 - 获取循环确定:以前的 Hibernate 版本确定使用深度优先方法获取,偶尔会导致奇数的"循环"确定。从 Hibernate 6.0 开始,现在首先使用宽度首先获取确定。
-
重组 org.hibernate.loader:
loader.collection软件包的内容被重构为loader.ast.spi和loader.ast.internal,并适应 SQM API。 -
重组 SQL 软件包:
sql.ordering的内容被移到metamodel.mapping.ordering.ast。 -
hbm.xml 映射的弃用: Legacy
hbm.xml映射格式已弃用,并将不再支持 6.x。 -
lazy 关联广告:在 Hibernate 6.0 之前,使用
fetch="join" 或 @Fetch (FetchMode.JOIN)的 lazy 关联在通过id i.e 加载时被视为 eager。从 Hibernate 6.0 开始,无论获取机制如何,这些关联都被正确遵守。通过指定lazy="false" 或 @ManyToOne (fetch = EAGER)/@OneToOne (fetch = EAGER)/@OneToMany (fetch = EAGER)/@ManyToMany (fetch = EAGER)来实现向后兼容。 -
对于
hbm.xml <return-join/> 的行为变化:根据 Hibernate 6.0,<return-join/> 会导致获取关联,而不是添加选择项目。
有关这些功能的更多信息,请参阅 Hibernate ORM 6.0 迁移指南。
Hibernate 6.0 发行版本还包含从以前的 Hibernate 版本中删除的许多功能,如下所示:
-
现在不允许使用
hbm.xml多个 <column/> - 在 6.0 中删除了对带有多个列的基本属性映射的支持。组件类属性现在支持正确解释CompositeUserType类。 - 传统 Hibernate 标准 API - Hibernate 6.0 中已被弃用的传统 Hibernate 标准 API 已在 Hibernate 6.0 中删除。
-
通过 NativeQuery 的调用 - 使用
NativeQuery调用 SQL 功能和程序不再被支持。使用org.hibernate.procedure.ProcedureCall或jakarta.persistence.StoredProcedureQuery等方法。 - HQL 获取所有 properties 子句 - 获取所有 properties 子句已从 HQL 语言中删除。
- JMX 集成 - Hibernate 不再为将其与 JMX 环境集成提供内置支持。
- JACC 集成 - Hibernate 不再为将其与 JACC 环境集成提供内置支持。
有关 Hibernate 6.0 中删除的功能的更多信息,请参阅 Hibernate ORM 6.0 迁移指南。
7.8.5. 从 Hibernate ORM 6.0 迁移到 6.1 复制链接链接已复制到粘贴板!
本节重点介绍从 Hibernate ORM 版本 6.0 迁移到 6.1 所需的更改。有关 Hibernate ORM 6.0 和 Hibernate ORM 6.1 间实施的更改的更多信息,请参阅 Hibernate ORM 6.1 迁移指南。
Hibernate 6.1 发行版本包含以下更改:
-
基本数组:除
byte[]/Byte[]和char[]/Character[]以外的基本数组,基本集合(仅子类型集合)映射到类型代码SqlTypes.ARRAY,它映射到由新方法getArrayTypeName决定的 SQL标准数组类型,并支持org.hibernate.dialect.Dialect.Dialect。 -
Enum 映射更改:现在默认映射到类型代码
SqlType.SMALLINT,就像它映射到TINYINT之前。这个映射不正确,因为 Java 有效地允许 32K 枚举条目,但TINYINT只是一个 1 字节类型。
有关 Hibernate 6.1 中包含的功能的详细信息,请参阅 Hibernate ORM 6.1 迁移指南。
7.8.6. 从 Hibernate ORM 6.1 迁移到 6.2 复制链接链接已复制到粘贴板!
本节重点介绍从 Hibernate ORM 版本 6.1 迁移到 6.2 所需的更改。有关 Hibernate ORM 6.1 和 Hibernate ORM 6.2 之间实现的更改的更多信息,请参阅 Hibernate ORM 6.2 迁移指南。
Hibernate 6.2 发行版本包含以下改进,如下所示:
DDL 类型更改:
-
OffsetTime 映射更改 - 在此发行版本中,
OffsetTime依赖于@TimeZoneStorage和hibernate.timezone.default_storage设置。由于默认设置为TimeZoneStorageType.DEFAULT,这意味着此类列的 DDL 期望已更改。 -
MariaDB 上的 UUID 映射更改 - 在 MariaDB 上,类型代码
SqlTypes.UUID默认引用 DDL 类型uuid,与使用binary (16)的位置相比。由于这个变化,在现有数据库中可能会出现模式验证错误。 -
SQL Server - On SQL Server 上的 UUID 映射更改,类型代码
SqlTypes.UUID默认指的是 DDL 类型唯一identifier,与使用二进制(16)的位置相比。由于这个变化,在现有数据库中可能会出现模式验证错误。 -
与使用
clob之前相比,Oracle 12.1+ 上的 JSON 映射更改,类型代码SqlTypes.JSON默认指的是 DDL 类型 blob 和 21+ 到 json。由于这个变化,在现有数据库中可能会出现模式验证错误。 -
H2 上的 JSON 映射更改 - On H2 1.4.200+,类型代码
SqlTypes.JSON默认引用 DDL 类型 JSON,与使用clob的位置相比。由于这个变化,在现有数据库中可能会出现模式验证错误。 - enums 的 datatype - 从 Hibernate 6.2 开始,选择隐式 SQL datatype 以存储枚举类上定义的条目数量敏感。
-
timezone 和 offset 存储 -
hibernate.timezone.default_storage现在默认为DEFAULT。 -
byte[]/Character[] 映射更改 - Hibernate 6.2 使其可配置,以处理域模型中的
Byte[]和Character[]映射更改的映射。 -
用于可选一对一映射的 UNIQUE 约束 - Hibernate 的 Earlier 版本没有在数据库中为标记为可选 的逻辑一对一关联创建一个
UNIQUE约束。从 Hibernate 6.2 开始,这些 UNIQUE 约束现已创建。 -
Oracle 上的原生 SQL 查询的列类型(n,0) - Since Hibernate 6.0,根据精度,在 Oracle 上带有 scale 0 的列 type ,
tinyint,small, int, 或intbigint。现在,根据精度,带有 scale 0 的类型为 number 的列被解释为int或bigint。 - 删除了对旧数据库版本的支持 - Hibernate 6.2 引入了对 Hibernate 支持的大多数数据库版本的最低支持数据库版本的概念。
-
CDI 处理的更改 - 当 CDI 可用并配置了 CDI 时,Hibernate 可以使用 CDI
BeanManager解析各种 Bean 引用。从 Hibernate 6.2 开始,只有在hibernate.cdi.extensions设为true时,这些扩展才会从 CDIBeanManager解析。 -
更改默认和弃用 -
enableLazyInitialization和enableDirtyTracking增强工具选项、全局属性hibernate.bytecode.use_reflection_optimizer以及相应的hibernate.enhancer.enableLazyInitialization和hibernate.enhancer.enableDirtyTracking配置设置,将其默认值切换到true,这些设置现已弃用。 -
org.hibernate.cfg和org.hibernate.loader的软件包更新:org.hibernate.cfg和org.hibernate.loader软件包已更新,以明确显示被视为 API、SPI 和内部的合同之间的区别。 -
集成合同(SPI)的变化 - 在 Hibernate ORM 6.2 的开发过程中,以下 SPIs 已被修改:
EntityPersister#lock,EntityPersister#multiLoad,Executable#afterDeserialize, 和JdbcType#getJdbcRecommendedJavaTypeMapping ()。 - 查询路径比较 :根据 Hibernate 6.2,在早期检查的路径比较。
-
batch Fetching 和 LockMode - 当
LockMode大于READ时,Hibernate 不会执行批处理获取,因此不会初始化现有的未初始化代理。这是因为锁定模式与批处理获取队列中的一个代理不同。
7.8.7. 从 Hibernate ORM 4.3 迁移到 Hibernate ORM 5.0 复制链接链接已复制到粘贴板!
JBoss EAP 7.0 包括 Hibernate ORM 5.0。本节重点介绍从 Hibernate ORM 版本 4.3 迁移到版本 5 时所需的更改。有关 Hibernate ORM 4 和 Hibernate ORM 5 之间实施的更改的更多信息,请参阅 Hibernate ORM 5.0 迁移指南。
删除和弃用的类
以下已弃用的类已从 Hibernate ORM 5 中删除:
对类和软件包的其他更改
-
org.hibernate.integrator.spi.Integrator接口已针对重新设计的 bootstrap 进行了相应的改变。 -
创建了新的软件包
org.hibernate.engine.jdbc.env.spi。它包含org.hibernate.engine.jdbc.env.spi.JdbcEnvironment接口,该接口是从org.hibernate.engine.jdbc.spi.JdbcServices接口中提取的。 -
引入了一个新的
org.hibernate.boot.model. relational.ExportableProducer接口,它将影响org.hibernate.id.PersistentIdentIdentifierGenerator实现。 -
org.hibernate.id.Configurable的签名被修改为接受org.hibernate.service.ServiceRegistry而不是org.hibernate.dialect.Dialect。 -
org.hibernate.metamodel.spi.TypeContributor接口已迁移到org.hibernate.boot.model.TypeContributor。 -
org.hibernate.metamodel.spi.TypeContributions接口已迁移到org.hibernate.boot.model.TypeContributions。
类型处理
-
内置
org.hibernate.type.descriptor.sql.SqlTypeDescriptor实现不再使用org.hibernate.type.descriptor.sql.SqlTypeDescriptorRegistry自动注册。使用自定义SqlTypeDescriptor实现来扩展内置实现并依赖于该行为的应用程序必须更新,以调用SqlTypeDescriptorRegistry.addDescriptor ()本身。 -
对于定义为生成的 UUID 的 ID,一些数据库需要您明确设置
@Column (length=16)以便生成BINARY (16),以便比较可以正常工作。 -
对于
hbm.xml中定义的EnumType映射,您希望javax.persistence.EnumType.STRINGname-mapping,必须使用useNamed (true)设置或指定12的 VARCHAR 设置来显式声明此配置。
事务管理
-
事务下的 SPI 在 Hibernate ORM 5 中进行了重大重新设计。在 Hibernate ORM 4.3 中,您使用
org.hibernate.TransactionAPI 来直接访问不同的后端事务策略。Hibernate ORM 5 引入了一定程度的间接性。在后端,org.hibernate.Transaction实现现在与org.hibernate.resource.transaction.TransactionCoordinator对话,它代表基于后端策略给定会话的事务上下文。虽然这对开发人员没有直接影响,但可能会影响 bootstrap 配置。之前的应用程序会指定hibernate.transaction.factory_class属性,它现已被弃用,并指代一个org.hibernate.engine.transaction.spi.TransactionFactoryFQN(完全限定名称)。使用 Hibernate ORM 5 时,您可以指定hibernate.transaction.coordinator_class设置,并引用org.hibernate.resource.transaction.TransactionCoordinatorBuilder。详情请查看org.hibernate.cfg.AvailableSettings.TRANSACTION_COORDINATOR_STRATEGY。 现在可识别以下短名称:
-
JDBC :使用 JDBC
java.sql.Connection管理事务。这是非 Jakarta Persistence 事务的默认值。 jta: 使用 Jakarta 交易管理事务。
重要如果 Jakarta Persistence 应用没有为
hibernate.transaction.coordinator_class属性提供设置,则 Hibernate 将自动根据持久性单元的事务类型构建正确的事务协调器。如果非 Jakarta Persistence 应用程序不提供
hibernate.transaction.coordinator_class属性的设置,则 Hibernate 将默认为jdbc管理事务。如果应用程序实际使用 Jakarta 事务,则此默认将引发问题。使用 Jakarta Transactions 的非 Jakarta Persistence 应用应明确将hibernate.transaction.coordinator_class属性值设置为jta,或提供自定义org.hibernate.resource.transaction.TransactionCoordinatorBuilder,它构建了一个org.hibernate.resource.transaction.TransactionCoordinator,它与 Jakarta Transactions 正确协调。
-
JDBC :使用 JDBC
其他 Hibernate ORM 5 更改
-
cfg.xml文件再次被完全解析,并与事件、安全和其他功能集成。 -
使用
EntityManagerFactory从cfg.xml加载的属性没有之前使用hibernate的前缀名称。现在,已保持一致。 - 配置不再是连续的。
-
org.hibernate.dialect.Dialect.getQuerySequencesString ()方法现在检索目录、模式和递增值。 -
AuditConfiguration修饰符已从org.hibernate.envers.boot.internal.EnversService中删除。 -
AuditStrategy方法参数被修改为删除过时的AuditConfiguration,并使用新的EnversService。 -
org.hibernate.hql.spi软件包和子软件包中的各种类和接口已移到新的org.hibernate.hql.spi.id软件包中。这包括MultiTableBulkIdStrategy类和AbstractTableBasedBulkIdHandler、TableBasedDeleteHandlerImpl、TableBasedUpdateHandlerImpl接口及其子类。 - 对属性访问合同进行完全重新设计。
-
现在,使用 org.hibernate.cache.spi.access.cache.spi.access.AccessType .getExternalName ()方法而不是
org.hibernate.cache.spi.access.AccessTypeenum constants 来定义有效的hibernate.cache.default_cache_concurrency_strategy设置值。这与其他 Hibernate 设置一致。
7.8.8. 从 Hibernate ORM 5.0 迁移到 Hibernate ORM 5.1 复制链接链接已复制到粘贴板!
JBoss EAP 7.1 包括 Hibernate ORM 5.1。本节重点介绍从 Hibernate ORM 版本 5.0 迁移到版本 5.1 所需的区别和所需更改。
Hibernate ORM 5.1 功能
Hibernate 的这个版本包括性能改进和程序错误修复。如需更多信息,请参阅 7.1.0 的 JBoss EAP 发行注记中的 Hibernate ORM 5.1 功能。有关在 Hibernate ORM 5.0 和 Hibernate ORM 5.1 之间实施的更改的更多信息,请参阅 Hibernate ORM 5.1 迁移指南。
模式管理工具更改
JBoss EAP 7 中的模式管理工具更改
Hibernate ORM 5.1 中的模式管理工具更改专注于以下区域:
-
统一处理
hbm2ddl.auto,并支持 hibernate 的 Jakarta Persistence模式-generation。 - 从 SPI 中删除 JDBC 顾虑,以促进 Hibernate OGM(一种为 NoSQL 数据存储提供 Jakarta Persistence 支持)的持久性引擎。
模式管理工具更改只是直接使用以下类的应用程序的迁移问题:
-
org.hibernate.tool.hbm2ddl.SchemaExport -
org.hibernate.tool.hbm2ddl.SchemaUpdate -
org.hibernate.tool.hbm2ddl.SchemaValidator -
org.hibernate.tool.schema.spi.SchemaManagementTool,或其委派
JBoss EAP 7.1 中的模式管理工具更改
Hibernate ORM 5.1.10 包含在 JBoss EAP 7.1 中,引入了检索数据库表的策略,用于改进 SchemaMigrator 和 SchemaValidator 性能。此策略执行单个 java.sql.DatabaseMetaData#getTables (String, String, String[]) 调用来确定每个 javax.persistence.Entity 是否具有映射的数据库表。这是默认策略,它使用 hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=grouped 属性设置。此策略可能要求提供 hibernate.default_schema 和/或 hibernate.default_catalog。
要使用执行 java.sql.DatabaseMetaData#getTables (String, String, String[]) 调用 的每个 javax.persistence.Entity 的旧策略,请使用 hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=indivivi ally 属性设置。
JBoss EAP 7.4 包括 Hibernate ORM 5.3。本节重点介绍从 Hibernate ORM 5.1 迁移到 Hibernate ORM 5.2 时所需的一些更改,然后介绍 Hibernate ORM 5.3。
Hibernate ORM 5.2 功能
Hibernate ORM 5.2 使用 Java 8 JDK 构建,在运行时需要 Java 8 JRE。以下是本发行版本中进行的一些更改列表:
-
hibernate-java8模块已合并到hibernate-core中,Java 8 日期/时间数据类型现已原生支持。 -
hibernate-entitymanager模块合并到hibernate-core中。HibernateEntityManager和HibernateEntityManagerFactory已被弃用。 -
Session、StatelessSession和SessionFactory类层次结构被重构为移除已弃用的类,并与 Jakarta Persistence Metamodel API 更好地保持一致。 -
org.hibernate.persister和org.hibernate.tuple软件包中的 SPIs 已更改。任何使用这些 SPI 的自定义类都需要检查和更新。 -
LimitHandler更改引入了一个新的hibernate.legacy_limit_handler设置,该设置默认设置为false,它允许您启用传统的 Hibernate 4.3 限制处理程序行为。这会影响有限问题列表。 -
引入了一个新的检索数据库表的策略,改进了
SchemaMigrator和SchemaValidator性能。 -
此发行版本更改了
String、字符[] 和属性的Character[]CLOB值,在使用 PostgreSQL81Dialect 及其子类时,会如何处理@Lob。 -
@TableGenerator和@SequenceGenerator名称的范围已从 global 改为 local。
有关 Hibernate 5.2 中实施的更改的完整列表,请参阅 Hibernate ORM 5.2 迁移指南。
Hibernate ORM 5.3 功能
Hibernate ORM 5.3 添加了对 Jakarta Persistence 2.2 规范的支持。此发行版本包含遵守此规格的更改以及其他改进。以下是其中一些更改的列表:
对位置查询参数处理的更改会导致以下更改:
- 在 HQL/JPQL 查询中删除了对 JDBC 样式参数声明的支持。
- Jakarta Persistence 位置位置参数的行为与命名参数更为相似。
-
原生查询中的 JDBC 样式参数声明使用基于一键的参数声明,而不是零参数绑定与 Jakarta Persistence 保持一致。您可以通过将
hibernate.query.sql.jdbc_style_params_base属性设置为true来恢复到基于零的绑定。
-
为遵守 Jakarta Persistence 规格,由
@TableGener存储的值存储的序列值是最后生成的值。在以前的版本中,Hibernate 存储下一个序列值。您可以使用hibernate.id.generator.stored_last_used属性启用传统的 Hibernate 行为。使用@TableGenerator和迁移到 Hibernate 5.3 的现有应用程序必须将hibernate.id.generator.stored_last_used 配置属性设置为false。 -
org.hibernate.query.QueryParameter类中的getType()方法被重命名为getHibernateType()。 - Hibernate 的第二个缓存 SPI 被重新设计,以更好地满足各种缓存供应商的要求。可在 HHH-11356 中找到详情。
- HHH-11356 的更改还需要更改消费者,这会影响 Hibernate Statistics 系统。
-
有些方法被临时添加到
org.hibernate.Query类中,以便更轻松地将原生应用程序从 Hibernate ORM 5.1 迁移到 5.3,并维护 Hibernate 5.1 分页行为。这些方法已弃用,要使用休眠版本来可移植,应该更新应用程序以使用 Jakarta Persistence 方法。 -
对将 Infinispan 用作 Hibernate 第二级缓存提供程序的支持已移到 Infinispan 项目中。因此,
hibernate-infinispan模块已被丢弃。 -
org.hibernate.tool.enhance.EnhancementTaskAnt 任务的 API 已更改。使用setBase ()和setDir ()方法丢弃了addFileset ()方法。详情可在 HHH-11795 中找到。 - Hibernate 4.3 中引入了一个错误,导致嵌入的集合元素和复合 ID 中的多到一关联,即使在显式映射为 lazy 时也是如此。在 Hibernate 5.3.2 中,这个程序错误已被解决。因此,这些关联会根据其映射指定。详情可在 HHH-12687 中找到。
-
本发行版本中,Jakarta Persistence 和 Hibernate 事件监听器的原生实现。因此,
JpaIntegrator类已过时。扩展org.hibernate.jpa.event.spi.JpaIntegrator的类必须进行修改,以更改这些类以实施org.hibernate.integrator.spi.Integrator接口。可在 HHH-11264 中找到详细信息。 -
org.hibernate.persister软件包中的 SPI 已更改。任何使用这些 SPI 的自定义类都需要检查和更新。
有关 Hibernate 5.3 中所实施的其他更改的完整列表,请参阅 Hibernate ORM 5.3 迁移指南。
Hibernate 5.1 和 Hibernate 5.3 之间的更改异常
在 Hibernate 5.2 和 5.3 中,使用 Hibernate 的原生 Bootstrap 构建的 SessionFactory 异常处理,按照 Jakarta Persistence 规格嵌套或转换 HibernateException。这个行为的唯一例外是在操作是特定于 Hibernate 时,如 Session.save () 或 Session.saveOrUpdate ()。
在 Hibernate 5.3.3 中,添加了 hibernate.native_exception_handling_51_compliance 属性。此属性指示使用 Hibernate 的原生 bootstrap 构建的 SessionFactory 异常处理是否与 Hibernate ORM 5.1 中的原生异常处理行为相同。当设置为 true 时,会根据 Jakarta Persistence 规范,不会嵌套或转换HibernateException。对于使用 Jakarta Persistence bootstrapping 构建的 SessionFactory,会忽略此设置。
兼容性转换器
JBoss EAP 7.4 包含一个兼容性转换器,它解决了 Hibernate ORM 5.3 API 方法,它们不再与 Hibernate ORM 5.1 兼容。转换程序是一种临时措施,允许使用 Hibernate ORM 5.1 构建的应用程序在 JBoss EAP 7.4 中表现出与 Hibernate 5.3 相同的行为。这是一个临时解决方案,您应该将这些方法调用替换为推荐的 Jakarta Persistence 方法调用。
您可以使用以下方法之一启用转换器:
-
您可以通过将
Hibernate51CompatibilityTransformer系统属性设为true来为所有应用程序全局启用转换器。 您可以使用
jboss-deployment-structure.xml文件在应用程序级别启用转换程序。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
下表列出了正在转换的 Hibernate 5.1 方法,并将其转换为 Hibernate 5.3 方法:
| Hibernate 5.1 参考或方法 | 转换为 Hibernate 5.3 参考或方法 |
|---|---|