Hibernate ORM 5有哪些新特性?
我刚刚看到第四名候选人获得了Hibernate 5的发布。与早期版本相比,5中有哪些新function?
Hibernate 5.x中增加了一些令人兴奋的function。 快看一下。
1.hibernatesearch
Hibernate Search透明地为您的对象编制索引,并提供快速的常规,全文和地理位置search。 易于使用和易于集群是核心。
- 全文search实体 – 通过近似查找(模糊search)
- 集群友好 – 提供了几个易于设置的集群策略
- 分面和地理定位 – 地理定位实体和@Spatial一样简单
有关Hibernate Search的更多详细信息,请查看。
2. Hibernatevalidation器
Hibernate Validator附带了一些内置的validation规则,比如Email,Length,NotBlank等
以基于注解的约束以标准化的方式expressionvalidation规则,并从与各种框架的透明集成中受益。
有关Hibernate Validator的更多详细信息,请查看。
3.改进了Java 8支持
Java 8date/时间数据types(JSR 310)受支持,可以通过@Past和@Future进行validation。 另外可选和JavaFXtypes通过改进的ValidatedValueUnwrapper支持。
4.hibernateOGM
刚刚发布了第一个稳定版本。
5.引导API
新的引导API – 更好的确定性,更好的集成
其他一些事情:
- 扫描支持非JPA使用
- NamingStrategy已被删除,赞成devise更好的API
- 能够处理标记为GenerationType#AUTO的id属性的附加Javatypes。 内置支持号码和UUID。 可以通过新的org.hibernate.boot.model.IdGeneratorStrategyInterpreter扩展来扩展。
- 此外,对AttributeConverters的支持已经扩展并且更加充分地实现
查看Hibernate ORM路线图了解更多细节。
在Hibernate 5中有一长串的东西被改变了:
-
新的引导API,所以我们可以在不需要
persistence.xml
文件的情况下以编程方式引导JPA环境 。 -
从5.0开始,Hibernate Spatial是Hibernate项目的一部分,所以我们也可以处理GIS数据。
-
Java 8date和时间types在域模型映射中受支持。 标准SQLdate/时间types与受支持的Java 8date/时间types之间的映射如下所示:
- DATE:
java.time.LocalDate
- TIME:
java.time.LocalTime
,java.time.OffsetTime
- TIMESTAMP:
java.time.Instant
,java.time.LocalDateTime
,java.time.OffsetDateTime
和java.time.ZonedDateTime
- DATE:
-
字节码增强机制是从头开始重新devise的,Hibernate同时具有Maven和Gradle插件。 字节码检测有三个主要方面:
-
延迟初始化:字段可以声明为
LAZY
,只有在第一次被访问时才会被读取。 -
脏检查:增强了实体,以便在加载到持久性上下文中后,可以跟踪所有被更改的属性。
-
双向关联:即使开发人员只更新单边,也可以自动同步双向关联的双方。
-
-
Hibernate的本地API(
Session
等)已被更新为使用genericstypes。 在获取实体时不需要进行转换。 -
Hibernate 5.0将其扩展到更广泛的types(例如
UUID
)。 -
二级caching通过引用。 此function可以将实体引用直接存储到不可变实体的二级caching中。
-
从Hibernate 5.0开始,我们有一个全新的从零开始编写的用户指南 。
Hibernate 5.1增加了以下function:
- 您现在可以在JPQL和HQL查询中join不相关的实体
- 多个实体通过标识符加载
Hibernate 5.2增加了对以下的支持:
- Java 1.8,所以你现在可以使用
Query.stream()
- Hibernate
Session
扩展了EntityManager
所以你可以直接从Session
访问所有的JPA方法 - 支持JCache
- 会话级批量大小
-
Timestamp
和Time
全球时区设置(例如UTC) - 不同的传递提示
- 更高效的JPQL和HQLparsing常量值
-
hibernate.connection.provider_disables_autocommit
资源本地事务优化 。 - 更好地处理Criteria API文字 。
Hibernate 5有5个新function
1.将Date和Time API的类支持为BasicTypes新的Date和Time API是Java 8中最受期待的更改之一。旧的java.util.Date有很多问题最终得到解决。
不幸的是,JPA 2.1和Hibernate 4不提供对它的直接支持。 但这不是一个大问题。 它只需要几行代码来实现映射LocalDate的AttributeConverter。
但显然,作为BasicType的明确支持仍然好很多。 Hibernate在5.0版本中实现了这个function。 此后,您不需要任何额外的注释或转换器来持续date和时间API的类。 您可以像使用其他支持的属性types一样使用它们。
2.以Stream的forms获取查询结果介绍一种新的方法,以Stream的forms为您提供查询结果,听起来不是什么大事。 但是Hibernate的Query接口的stream方法提供了额外的好处,使得它对于巨大的结果集尤其有趣。 它以多个批次获取结果集,并使用Hibernate的ScrollableResults实现来滚动它。 如果您使用Stream逐个处理结果集logging,并帮助您高效地实现用例,则此方法非常适合。
您可以使用自Hibernate 5.2以来的新方法来获取您的查询结果。 下面的代码片段显示了一个简单的例子,它从数据库中select所有的Book实体,并将它们作为一个Stream进行处理。
3.通过主键获取多个实体
通过ID获取多个实体是一个非常常见的用例。 大多数开发人员通过一个循环来实现它,该循环调用每个主键的EntityManager的find方法,或者使用JPQL查询来检查IN子句中的所有主键值。 第一个选项需要Hibernate为每个主键执行数据库查询。 这可能会造成巨大的性能问题。 第二个允许您使用一个查询获取所有实体,显然是更好的select。
Hibernate 5.1引入了第三个选项,避免了第一个的问题,比第二个更容易使用。 新的MultiIdentifierLoadAccess接口为使用一个查询加载多个实体提供了一个舒适的选项。 你只需要调用Hibernate Session上的byMultipleIds方法来获得一个MultiIdentifierLoadAccess接口,并为multiLoad方法提供一个主键值列表。 Hibernate的实现还提供了一个额外的好处:它将大量主键值分成多个批次。 这有时是必需的,因为有些数据库限制了IN子句中元素的数量。
4.在查询中join未关联的实体
您可以轻松地在JPQL查询中的实体之间join映射的关联。 该映射已经提供了所需的连接条件,并且不需要在查询中提供它们。
但是映射关联的数据库表但没有映射关联的实体呢?
这不是一个反问的问题。
大多数实体模型不映射所有可能的关联。 他们只映射似乎在域模型中提供价值的那些,而不是那些2个数据库表(似乎是偶然的)存储相同外键的那些。 这也经常发生,许多有许多logging的多对多关联不会被映射到Hibernate。 有人称之为协会的吸气者并且获得数百或数千个实体的风险太高。
只要看看域模型,这就完全正常了。 您可能不需要模型中的这些关联。 但这并不意味着你不需要在你的JPQL查询中使用它们。
如果是这样的话,你有3个select:
1模拟实体之间的关联
2在您的JPQL查询中使用交叉连接,这可能会导致性能问题或
3使用Hibernate专有的JOIN子句。 我更喜欢选项3.这是最简单,最自然的select。
从Hibernate 5.1开始,你可以使用类似SQL的语法来join实体而不需要build模关联。
5. @Repeatable注释
可重复的注释是Java 8中较小的更改之一。它允许您多次使用相同的注释来注释类,属性或接口。 一个典型的JPA例子是为一个实体定义多个命名的查询。
到目前为止,您必须使用包含@NamedQuery批注数组的@NamedQueries批注对实体进行批注。 令人讨厌的是@NamedQueries注解只是一个容器。 它本身并没有提供任何价值。 从Hibernate 5.2开始,你不必再这样做了。 至less不会使用Hibernate的org.hibernate.annotations.NamedQuery注解版本。 @NamedQuery和许多其他的Hibernate注解现在可以重复使用,并且可以多次分配。 正如你在下面的代码片段中看到的,这使得代码更易于阅读,使用起来更舒适。
Creadit /来源 : https : //www.thoughts-on-java.org/5-new-features-hibernate-5-every-developer-know/