7.8. Hibernate 更改
JBoss EAP 8.1 包含对 Hibernate ORM 6.6 的支持,这是一个用于 Java 编程语言的对象关系映射工具。有关 Hibernate ORM 6.6 文档的更多信息,请参阅 Hibernate ORM 6.6 文档。
从 JBoss EAP 8.0 迁移到 JBoss EAP 8.1 时,请参考 Hibernate ORM 版本的特定 Hibernate ORM 迁移文档。
要从 JBoss EAP 8.0 迁移到 JBoss EAP 8.1,您必须完成以下步骤:
要从 JBoss EAP 7.4 迁移到 JBoss EAP 8.1,还必须完成以下步骤:
- 从 Hibernate ORM 5.3 迁移到 6.2
- Hibernate ORM dialects
- 弃用的 Hibernate ORM 类
- 禁用 Hibernate ORM 类
- Hibernate ORM 内部
要从 JBoss EAP 和 Hibernate 的旧版本迁移,您还必须完成以下步骤。
7.8.1. 从 Hibernate ORM 6.2 迁移到 6.6 复制链接链接已复制到粘贴板!
JBoss EAP 8.1 包括 Hibernate ORM 6.6。有关 Hibernate ORM 6.2 和 Hibernate ORM 6.6 之间实施的更改的更多信息,请参阅以下 Hibernate 迁移指南:
7.8.1.1. 删除了 Hibernate ORM 功能 复制链接链接已复制到粘贴板!
以下 ORM 功能已从 Hibernate 中删除:
- HQL 空字面比较
-
在早期版本的 Hibernate 中,可以使用
=和 <>/!=运算符将表达式与 null 字面进行比较。这种方法是计数器的,因为比较解析为 null 的参数或表达式将始终产生假。
从 Hibernate ORM 6.3 开始,HQL 中的特殊处理已被删除。没有可用于保持向后兼容性的方法。用户需要更新这些查询以使用 null, predicate 语法。
且不是 null
如需更多信息,请参阅 HQL 空字面比较。
- Removed
idGeneratorStrategyInterpreter -
从 Hibernate ORM 6.0 开始,
idGeneratorStrategyInterpreter已被弃用,并从 Hibernate ORM 6.4 中删除,以简化 id 生成器内部。 - 生成的值
-
从 Hibernate ORM 6.5 开始,
@GeneratedValue注释被删除,将导致抛出异常AnnotationException。用户需要从其应用中删除@GeneratedValue注释。
7.8.1.2. 删除了 Hibernate ORM 类 复制链接链接已复制到粘贴板!
本节提供有关在将来的 Hibernate ORM 发行版本中可能会删除的 Hibernate ORM 类的附加信息。如需更多信息,请参阅 已弃用 Hibernate ORM 类。
7.8.1.3. 禁用 Hibernate ORM 类 复制链接链接已复制到粘贴板!
本节为仍在开发的 Hibernate ORM 类提供了其他信息,例如,在 Hibernate ORM 版本未来的主版本、次版本或微版本中可能会更改。如需更多信息,请参阅 增加 Hibernate ORM 类。
7.8.2. 从 Hibernate ORM 5.3 迁移到 6.2 复制链接链接已复制到粘贴板!
JBoss EAP 7.4 包括 Hibernate ORM 6.2。有关 Hibernate ORM 5.3 和 Hibernate ORM 6.2 之间实施的更改的更多信息,请参阅以下 Hibernate 迁移指南:
7.8.3. 从 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
-
事务下的 SPI 在 Hibernate ORM 5 中进行了重大重新设计。在 Hibernate ORM 4.3 中,您使用
- 其他 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 设置一致。
-
7.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 发行版本包括性能改进和程序错误修复。如需更多信息,请参阅 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, String[])调用,以确定每个javax.persistence.Entity是否有映射的数据库表。这是默认策略,它使用hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=grouped属性设置。此策略可能要求提供hibernate.default_schema和/或hibernate.default_catalog。
要使用 为每个 javax.persistence.Entity 来执行 java.sql.DatabaseMetaData#getTables (String, String, String[]) 调用的旧策略,请使用 hibernate.hbm2ddl.jdbc_metadata_extraction_strategy=indidu 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性能。 -
此发行版本更改了在使用 PostgreSQL81Dialect 及其子类时处理
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/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 分页行为。这些方法已弃用,在以后的 Hibernate 版本中可以移植,应该更新应用程序以使用 Jakarta Persistence 方法。 -
对将 Infinispan 用作 Hibernate 第二级缓存提供程序的支持已移到 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.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文件在应用程序级别启用转换程序。<jboss-deployment-structure> <deployment> <transformers> <transformer class="org.jboss.as.hibernate.Hibernate51CompatibilityTransformer"/> </transformers> </deployment> <sub-deployment name="main.war"> <transformers> <transformer class="org.jboss.as.hibernate.Hibernate51CompatibilityTransformer"/> </transformers> </sub-deployment> </jboss-deployment-structure>
下表列出了正在转换的 Hibernate 5.1 方法,并将其转换为 Hibernate 5.3 方法:
| Hibernate 5.1 参考或方法 | 转换为 Hibernate 5.3 参考或方法 |
|---|---|