[英]What's new in Hibernate ORM 5?
我刚刚看到 Hibernate 5 的第 4 个候选版本发布了。与早期版本相比,5 中有哪些新内容?
在 Hibernate 5.x 中添加/增强了一些令人兴奋的功能。 快看一下。
Hibernate Search 透明地索引您的对象并提供快速的常规、全文和地理定位搜索。 易用性和易于聚类是核心。
有关 Hibernate Search 的更多详细信息,请查看此内容。
Hibernate Validator 带有一些内置的验证规则,如 Email、Length、NotBlank 等。
使用基于注释的约束以标准化方式表达验证规则,并受益于与各种框架的透明集成。
有关 Hibernate Validator 的更多详细信息,请查看此内容。
支持 Java 8 日期/时间数据类型 (JSR 310),并且可以通过 @Past 和 @Future 进行验证。 通过改进的 ValidatedValueUnwrapper 还支持 Optional 和 JavaFX 类型。
刚刚发布了第一个稳定版本。
新的引导 API - 更好的确定性,更好的集成
其他一些事情:
查看Hibernate ORM 路线图以获取更多详细信息。
在 Hibernate 5 中有一长串改变的东西:
一个新的引导 API,因此我们可以以编程方式引导 JPA 环境,而无需persistence.xml
文件。
从 5.0 开始,Hibernate Spatial 是 Hibernate 项目的一部分,因此我们也可以处理 GIS 数据。
域模型映射支持Java 8 日期和时间类型。 标准 SQL 日期/时间类型与受支持的 Java 8 日期/时间类类型之间的映射如下所示;
java.time.LocalDate
java.time.LocalTime
, java.time.OffsetTime
java.time.Instant
、 java.time.LocalDateTime
、 java.time.OffsetDateTime
和java.time.ZonedDateTime
字节码增强机制从头开始重新设计,Hibernate 具有 Maven 和 Gradle 插件。 我们可以通过字节码检测增强三个主要方面:
延迟初始化:可以将字段声明为LAZY
并且只有在第一次访问时才会获取它们。
脏检查:实体得到增强,以便它们可以跟踪在持久性上下文中加载后发生更改的所有属性。
双向关联:可以自动同步双向关联的两侧,即使开发人员只更新一侧。
Hibernate 的本机 API( Session
等)已更新为使用泛型类型。 获取实体时无需强制转换。
Hibernate 5.0 将此扩展到更广泛的类型集(例如UUID
)。
二级缓存引用。 此功能支持将实体引用直接存储到不可变实体的二级缓存中。
从 Hibernate 5.0 开始,我们有一个从头开始编写的全新用户指南。
Hibernate 5.1添加了以下功能:
Hibernate 5.2添加了以下支持:
Query.stream()
Session
扩展了EntityManager
因此您可以直接从Session
访问所有 JPA 方法Timestamp
和Time
全球时区设置(例如 UTC)hibernate.connection.provider_disables_autocommit
资源本地事务优化。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.