Hibernate ORM 5.3.0.Final版本已经发布。

JPA 2.2 支持

Hibernate ORM 5.3实现了对JPA 2.2的支持。

CDI 托管的属性转换器

从JPA 2.1开始,应用程序可以使用CDI 托管的bean作为实体事件监听器。JPA 2.2扩展了这种支持,允许属性转换器也可以作为CDI 托管的bean。

为了便于实现,我们开发了一个通用接口,允许访问任何类型的bean,这些bean托管在任何类型的DI/bean容器中。集成此类bean容器的合约是org.hibernate.resource.beans.container.spi.BeanContainer。Hibernate提供了与CDI集成的BeanContainer实现;我们还测试了将其适配到Spring容器。

应用程序通常不会访问这些服务。但是,集成者可能希望使用它们来利用Hibernate与这些后端容器的集成。可以从org.hibernate.resource.beans.spi.ManagedBeanRegistry访问BeanContainer,这是一个服务,它根据Hibernate的正常使用隐藏了与BeanContainer相关的重复细节。ManagedBeanRegistry是一个服务,可以从SessionFactory的ServiceRegistry中访问。

重复注解的支持

JPA 2.2定义了对重复注解(@java.lang.annotation.Repeatable)的支持。这包括添加了@TableGenerators@SequenceGenerators。其他所有JPA注解已经具有“包含”注解。

查询结果流

JPA 2.2 增加了 Query#getStream 以支持查询结果的流式传输。当然,Hibernate 在很久以前就有了这个功能,尽管我们将其命名为 Query#stream,更符合其他大多数使用情况,包括大多数 JDK 使用情况。但无论如何,两者都是可用的,即 JPA 的 javax.persistence.Query#getStream 和 Hibernate 的 org.hibernate.query.Query#stream

支持 Java 8 日期和时间 API

这又是 Hibernate 已经支持了很长时间的功能。但 JPA 2.2 将支持 Java 8 日期/时间 API 作为标准的一部分。

缓存和继承

5.3 增加了在任何映射层次结构的级别上启用/禁用缓存的能力。这与之前版本不同,之前版本仅允许在根实体上控制缓存。有关详细信息,请参阅 HHH-12146

JpaCompliance

在启动过程中,SessionFactory/EntityManagerFactory 可以配置为具有“JPA 兼容性”级别,该级别指示它应遵守哪些行为。这些通常是 Hibernate 历史上做了一些不同的事情的情况,或者我们认为规范不是最佳解决方案的情况。这个 JpaCompliance 用于控制 Hibernate 在这些情况下应该如何行动。有关详细信息,请参阅 org.hibernate.jpa.JpaCompliance 的 javadocs。

更直观地处理 ID 生成器名称

以前,当 Hibernate 遇到一个与标识符相关的 @GeneratedValue 时,它会假设存在一个具有相同名称的命名生成器注释。例如,如果应用程序指定 @GeneratedValue(strategy=TABLE, name="abc"),Hibernate 就会期望看到一个具有相同名称的 @TableGenerator@org.hibernate.annotations.GenericGenerator。这意味着你经常会看到如下映射

@Entity
public class AnEntity {
    @Id
    @GeneratedValue(strategy=SEQUENCE, name="MY_SEQ")
    @SequenceGenerator(name="MY_SEQ", sequenceName="MY_SEQ")
    public Long getId() {...}

    ...
}

上面示例中的 SequenceGenerator 没有添加任何额外信息,实际上是完全不必要的。因此,Hibernate 现在将以与上述映射完全相同的方式识别以下映射

@Entity
public class AnEntity {
    @Id
    @GeneratedValue(strategy=SEQUENCE, name="MY_SEQ")
    public Long getId() {...}

    ...
}

二进制兼容性

Hibernate 5.2 引入了一些意外的(以及一些预期的)二进制不兼容性。Gail Badner 做了一个很好的工作,识别和分类了这些二进制不兼容性,这导致了一组工作来修复这些意外的二进制不兼容性,并在迁移指南中记录了预期的二进制不兼容性(如果尚未记录)。有关详细信息,请参阅 HHH-12424

Java 9 模块命名

Hibernate ORM jar 现在指定 Java 9 模块命名,格式为 org.hibernate.orm.${module-name}。例如,hibernate-core 的模块名称为 org.hibernate.orm.corehibernate-c3p0 的模块名称为 org.hibernate.orm.c3p0;等等。

改进内存消耗

HHH-12556HHH-12558 下进行的改进可以显著减少许多应用程序中 Hibernate SessionFactory 消耗的内存量。

更多信息


返回顶部