繁体   English   中英

Hibernate ORM 5 有哪些新功能?

[英]What's new in Hibernate ORM 5?

我刚刚看到 Hibernate 5 的第 4 个候选版本发布了。与早期版本相比,5 中有哪些新内容?

在 Hibernate 5.x 中添加/增强了一些令人兴奋的功能。 快看一下。

1.休眠搜索

Hibernate Search 透明地索引您的对象并提供快速的常规、全文和地理定位搜索。 易用性和易于聚类是核心。

  • 实体的全文搜索 -通过近似查找(模糊搜索)
  • 集群友好 -提供多种易于设置的集群策略
  • 分面和地理定位 - 地理定位实体就像@Spatial 一样简单

有关 Hibernate Search 的更多详细信息,请查看此内容。

2. 休眠验证器

Hibernate Validator 带有一些内置的验证规则,如 Email、Length、NotBlank 等。

使用基于注释的约束以标准化方式表达验证规则,并受益于与各种框架的透明集成。

有关 Hibernate Validator 的更多详细信息,请查看此内容。

3. 改进的 Java 8 支持

支持 Java 8 日期/时间数据类型 (JSR 310),并且可以通过 @Past 和 @Future 进行验证。 通过改进的 ValidatedValueUnwrapper 还支持 Optional 和 JavaFX 类型。

4.休眠OGM

刚刚发布了第一个稳定版本。

5. 引导 API

新的引导 API - 更好的确定性,更好的集成


其他一些事情:

  • 对非 JPA 使用的扫描支持
  • NamingStrategy 已被删除,以支持设计更好的 API
  • 能够处理标记为 GenerationType#AUTO 的 id 属性的其他 Java 类型。 内置支持 Number 和 UUID。 可通过新的 org.hibernate.boot.model.IdGeneratorStrategyInterpreter 扩展进行扩展。
  • 此外,对 AttributeConverters 的支持也得到了扩展和更全面的实现

查看Hibernate ORM 路线图以获取更多详细信息。

在 Hibernate 5 中有一长串改变的东西:

  1. 一个新的引导 API,因此我们可以以编程方式引导 JPA 环境,而无需persistence.xml文件

  2. 从 5.0 开始,Hibernate Spatial 是 Hibernate 项目的一部分,因此我们也可以处理 GIS 数据。

  3. 域模型映射支持Java 8 日期和时间类型 标准 SQL 日期/时间类型与受支持的 Java 8 日期/时间类类型之间的映射如下所示;

    • 日期: java.time.LocalDate
    • 时间: java.time.LocalTimejava.time.OffsetTime
    • 时间戳: java.time.Instantjava.time.LocalDateTimejava.time.OffsetDateTimejava.time.ZonedDateTime
  4. 字节码增强机制从头开始重新设计,Hibernate 具有 Maven 和 Gradle 插件。 我们可以通过字节码检测增强三个主要方面:

    • 延迟初始化:可以将字段声明为LAZY并且只有在第一次访问时才会获取它们。

    • 脏检查:实体得到增强,以便它们可以跟踪在持久性上下文中加载后发生更改的所有属性。

    • 双向关联:可以自动同步双向关联的两侧,即使开发人员只更新一侧。

  5. Hibernate 的本机 API( Session等)已更新为使用泛型类型。 获取实体时无需强制转换。

  6. Hibernate 5.0 将此扩展到更广泛的类型集(例如UUID )。

  7. 二级缓存引用。 此功能支持将实体引用直接存储到不可变实体的二级缓存中。

  8. 从 Hibernate 5.0 开始,我们有一个从头开始编写的全新用户指南

Hibernate 5.1添加了以下功能:

  1. 您现在可以在 JPQL 和 HQL 查询中加入不相关的实体
  2. 通过标识符加载多实体

Hibernate 5.2添加了以下支持:

  1. Java 1.8,因此您现在可以使用Query.stream()
  2. Hibernate Session扩展了EntityManager因此您可以直接从Session访问所有 J​​PA 方法
  3. 支持 JCache
  4. 会话级批量大小
  5. TimestampTime全球时区设置(例如 UTC)
  6. 独特的直通提示
  7. 更高效的 JPQL 和 HQL 解析常量值
  8. hibernate.connection.provider_disables_autocommit资源本地事务优化
  9. 更好地处理 Criteria API 文字

Hibernate 5有5个新功能

1.支持Date和Time API的类作为BasicTypes新的Date和Time API是Java 8中最令人期待的变化之一。旧的java.util.Date有很多问题最终得到修复。

不幸的是,JPA 2.1和Hibernate 4不提供直接支持。 但这不是一个大问题。 只需几行代码即可实现映射LocalDate的AttributeConverter。

但显然,作为BasicType的显式支持仍然好多了。 Hibernate在5.0版中实现了这一点。 从那时起,您不需要任何其他注释或转换器来保留Date和Time API的类。 您可以使用与任何其他受支持的属性类型相同的方式使用它们。

2.以流的形式获取查询结果引入一种新方法,为您提供查询结果,因为Stream听起来不是一件大事。 但是Hibernate的Query接口的stream方法提供了额外的好处,使得它对于巨大的结果集特别有趣。 它以多个批次获取结果集,并使用Hibernate的ScrollableResults实现滚动它。 如果您使用Stream逐个处理结果集记录并帮助您有效地实现用例,则此方法非常适合。

您可以使用自Hibernate 5.2以来的新方法来获取查询结果。 以下代码片段显示了一个简单示例,该示例从数据库中选择所有Book实体并将其作为Stream处理。

3.通过主键获取多个实体

通过ID获取多个实体是一个非常常见的用例。 大多数开发人员要么使用循环来实现它,该循环为每个主键调用EntityManager的find方法,要么使用JPQL查询来检查IN子句中的所有主键值。 第一个选项要求Hibernate为每个主键执行数据库查询。 这可能会产生巨大的性能问题。 第二个允许您使用一个查询获取所有实体,显然是更好的选择。

Hibernate 5.1引入了第三个选项,它避免了第一个问题,并且比第二个选项更容易使用。 新的MultiIdentifierLoadAccess接口提供了一个舒适的选项,可以通过一个查询加载多个实体。 您只需要在Hibernate Session上调用byMultipleIds方法以获取MultiIdentifierLoadAccess接口,并为multiLoad方法提供主键值列表。 Hibernate的实现还提供了额外的优势:它将大量主键值列表分成多个批次。 这有时是必需的,因为某些数据库限制了IN子句中的元素数量。

4.在查询中加入未关联的实体

您可以轻松地在JPQL查询中加入实体之间的映射关联。 映射已提供所需的连接条件,您无需在查询中提供它们。

但是,映射关联数据库表但没有映射关联的实体呢?

这不是一个修辞问题。

大多数实体模型都没有映射所有可能的关联。 它们只映射那些似乎在域模型中提供价值的映射,而不是映射2个数据库表(看似偶然)存储相同外键的映射。 它经常发生在许多方面与许多记录的多对多关联不会与Hibernate映射。 有人调用关联的getter并获取数百或数千个实体的风险太高了。

只要你看一下领域模型,这就完全没问题了。 您可能在模型中不需要这些关联。 但这并不意味着您在其中一个JPQL查询中不需要它们。

如果是这种情况,您有3个选择:

1模拟实体之间的关联或
2在JPQL查询中使用交叉连接,这可能会导致性能问题或
3使用Hibernate专有的JOIN子句。 我更喜欢选项3.这是最简单,最自然的选择。

从Hibernate 5.1开始,您可以使用类似SQL的语法来连接实体,而无需建模关联。

5. @Repeatable注释

可重复注释是Java 8中较小的更改之一。它允许您多次使用相同注释注释类,属性或接口。 您想要执行此操作的典型JPA示例是为实体定义多个命名查询。

到目前为止,您必须使用@NamedQueries注释来注释您的实体,该注释包含@NamedQuery注释数组。 令人讨厌的是@NamedQueries注释只是一个容器。 它本身不提供任何价值。 从Hibernate 5.2开始,您不必再这样做了。 至少不要只要使用Hibernate的org.hibernate.annotations.NamedQuery注释版本。 @NamedQuery和许多其他Hibernate注释现在都是可重复的,可以多次分配。 正如您在下面的代码片段中所看到的,这使得代码更易于阅读并且使用起来更加舒适。

Creadit /来源https//www.thoughts-on-java.org/5-new-features-hibernate-5-every-developer-know/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM