5.8. Hibernate 和 Jakarta Persistence 迁移更改
5.8.1. Hibernate ORM 3.0 复制链接链接已复制到粘贴板!
在 JBoss EAP 6.4 中使用 Hibernate ORM 3 的整合类已经从 JBoss EAP 7 中移除。如果您的应用程序仍然使用 Hibernate ORM 3 库,则强烈建议您迁移应用程序以使用 Hibernate ORM 5 作为 Hibernate ORM 5 作为 Hibernate ORM 3,无需大量工作。如果您无法迁移到 Hibernate ORM 5,您必须为 Hibernate ORM 3 JARs 定义自定义 JBoss 模块,并不包括应用程序中的 Hibernate ORM 5 类。
5.8.2. Hibernate ORM 4.0 - 4.3 复制链接链接已复制到粘贴板!
如果您的应用程序需要启用第二级别的缓存,请注意 Infinispan 8.x 与 Hibernate ORM 5.0 集成。支持将 Infinispan 用作 Hibernate 2nd 级缓存提供商,然后被移到 Hibernate ORM 5.3 中的 Infinispan 项目,因此,Ehiber n-infinispan 模块已从该版本丢弃。
使用 Hibernate ORM 4.x 编写的应用程序仍然可以使用 Hibernate ORM 4.x。您必须为 Hibernate ORM 4.x JARs 定义自定义 JBoss 模块,并从应用程序中排除 Hibernate ORM 5 类。但是,强烈建议您重写应用程序代码以使用 Hibernate ORM 5。有关迁移到 Hibernate ORM 5 的详情,请参考 Migrating to Hibernate ORM 5。
5.8.3. 迁移到 Hibernate ORM 5 复制链接链接已复制到粘贴板!
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.boot.TypeContributor。 -
org.hibernate.metamodel.spi.TypeContributions接口已迁移到org.hibernate.boot.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接口及其子类。 - 全面重新设计属性访问合同。
-
有效的
hibernate.cache.default_cache_concurrency_strategy设置值现在使用org.hibernate.cache.spi.access.AccessType.getExternalName()方法而不是org.hibernate.cache.spi.access.AccessTypeenum constants 定义。这与其他 Hibernate 设置一致。
5.8.4. 从 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 的这个发行版本包括了很多性能改进和程序错误修复,它们包括在 JBoss EAP 7.1.0 发行注记中的 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 Persistenceschema-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, String[]) 调用每个 javax.persistence.Entity,使用 hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=individly 属性设置。
5.8.5. 从 Hibernate ORM 5.1 迁移到 Hibernate ORM 5.3 复制链接链接已复制到粘贴板!
JBoss EAP 7.4 包括 Hibernate ORM 5.3.本节重点介绍从 Hibernate ORM 5.1 迁移到 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性能。 -
此发行版本更改了在使用 PostgreSQL81Dialect 及其子类时处理带有
@Lob的String、character[]和Character[]属性的CLOB值的方式。 -
@TableGenerator和@SequenceGenerator名称的范围已从 global 改为 local。
有关 Hibernate 5.2 中实施的更改的完整列表,请参阅 Hibernate ORM 5.2 迁移指南。
Hibernate ORM 5.3 功能
Hibernate ORM 5.3 添加了对 Jakarta Persistence 2.2 规范的支持。此发行版本包含有关此规格的更改,以及其他改进。以下是这些更改的列表:
对位置查询参数处理的更改会导致以下更改:
- 移除在 HQL/Jakarta Persistence 查询语言查询中对 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 pagination 行为。这些方法已弃用,并在以后使用 Hibernate 版本进行可移植,应用程序应使用 Jakarta Persistence 方法。 -
支持将 Infinispan 用作 Hibernate 2nd-level 缓存提供商,已移至 Infinispan 项目。因此,
hibernate-infinispan模块已被丢弃。 -
org.hibernate.tool.enhance.EnhancementTaskAnt 任务的 API 已更改。addFileset()方法已被丢弃,而是使用setBase()和setDir()方法。详情可在 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.spi.Integrator接口。可在 HHH-11264 中找到详细信息。 -
org.hibernate.persister软件包中的 SPI 已更改。任何使用这些 SPI 的自定义类别都需要检查和更新。
有关 Hibernate 5.3 中所实施的其他更改的完整列表,请参阅 Hibernate ORM 5.3 迁移指南。
5.8.5.1. 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 构建的 Session factory 异常处理是否应该和 Hibernate ORM 5.1 中的原生异常处理相同。当设置为 true 时,会根据 Jakarta Persistence 规范,不会嵌套或转换HibernateException。对于使用 Jakarta Persistence bootstrapping 构建的 SessionFactory,会忽略此设置。
5.8.5.2. 兼容性转换器 复制链接链接已复制到粘贴板!
JBoss EAP 7.4 包括一个兼容性转换程序,它解决了与 Hibernate ORM 5.1 兼容的 Hibernate ORM 5.3 API 方法。转换程序是一种临时措施,允许使用 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 参考或方法 |
|---|---|