Hibernate ORM 5有哪些新特性?

我刚刚看到第四名候选人获得了Hibernate 5的发布。与早期版本相比,5中有哪些新function?

3 Solutions collect form web for “Hibernate ORM 5有哪些新特性?”

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中有一长串的东西被改变了:

  1. 新的引导API,所以我们可以在不需要persistence.xml文件的情况下以编程方式引导JPA环境 。

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

  3. Java 8date和时间types在域模型映射中受支持。 标准SQLdate/时间types与受支持的Java 8date/时间types之间的映射如下所示:

    • DATE: java.time.LocalDate
    • TIME: java.time.LocalTimejava.time.OffsetTime
    • TIMESTAMP: java.time.Instantjava.time.LocalDateTimejava.time.OffsetDateTimejava.time.ZonedDateTime
  4. 字节码增强机制是从头开始重新devise的,Hibernate同时具有Maven和Gradle插件。 字节码检测有三个主要方面:

    • 延迟初始化:字段可以声明为LAZY ,只有在第一次被访问时才会被读取。

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

    • 双向关联:即使开发人员只更新单边,也可以自动同步双向关联的双方。

  5. Hibernate的本地API( Session等)已被更新为使用genericstypes。 在获取实体时不需要进行转换。

  6. Hibernate 5.0将其扩展到更广泛的types(例如UUID )。

  7. 二级caching通过引用。 此function可以将实体引用直接存储到不可变实体的二级caching中。

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

Hibernate 5.1增加了以下function:

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

Hibernate 5.2增加了对以下的支持:

  1. Java 1.8,所以你现在可以使用Query.stream()
  2. Hibernate Session扩展了EntityManager所以你可以直接从Session访问所有的JPA方法
  3. 支持JCache
  4. 会话级批量大小
  5. TimestampTime全球时区设置(例如UTC)
  6. 不同的传递提示
  7. 更高效的JPQL和HQLparsing常量值
  8. hibernate.connection.provider_disables_autocommit资源本地事务优化 。
  9. 更好地处理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/

  • hibernate错误:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已经与会话关联
  • 什么是ORM,我可以在哪里了解更多信息?
  • 如何限制在教义2中的结果集大小?
  • 如何限制Django查询返回的列?
  • 如何在Django模型上存储字典?
  • JPQL IN子句:Java-数组(或列表,集合...)?
  • 指定索引(非唯一键)使用JPA
  • Django“无法添加或更新子行:外键约束失败”
  • SQLAlchemy─将一个类映射到多个表
  • unit testing数据库驱动应用程序的最佳策略是什么?
  • 获取在Laravel 3/4中执行的查询