JPA 2.2 功能
CDI 托管的 AttributeConverters
从 JPA 2.1 开始,应用程序可以使用 CDI 托管的 Bean 作为实体事件监听器。JPA 2.2 扩展了这种支持,允许 AttributeConverters 也作为 CDI 托管的 Bean。
为此,我们开发了一个通用接口,允许访问任何类型 DI/Bean 容器中托管的任何类型的 Bean。此类 Bean 容器集成的合同是 org.hibernate.resource.beans.container.spi.BeanContainer
。Hibernate 提供了与 CDI 集成的 BeanContainer
实现;我们还测试了将其适配到 Spring 容器。一般来说,Hibernate 通过其 org.hibernate.resource.beans.spi.ManagedBeanRegistry
服务访问 BeanContainer
,该服务隐藏了基于 Hibernate 常规使用的 BeanContainer
的某些重复细节。
应用程序通常不会访问 BeanContainer
或 ManagedBeanRegistry
。但是,集成人员可能希望使用它们来利用 Hibernate 与这些后端容器的集成。 ManagedBeanRegistry
是一种服务,可以通过 SessionFactory 的 ServiceRegistry 访问。可以通过 ManagedBeanRegistry#getBeanContainer
(可能返回 null)从那里访问 BeanContainer
。
对重复注解的支持
JPA 2.2 定义了对重复注解(@java.lang.annotation.Repeatable
)的支持。这包括添加了 @TableGenerators
和 @SequenceGenerators
。所有其他 JPA 注解已经拥有了“包含”注解。
Hibernate 功能
缓存和继承
5.3 添加了在任何映射层次结构级别启用/禁用缓存的能力。这与之前版本不同,之前版本仅允许在根实体上控制缓存。有关详细信息,请参阅 HHH-12146
Java 9 模块命名
Hibernate ORM JAR 现在指定 Java 9 模块命名,格式为 org.hibernate.orm.${module-name}
。例如,hibernate-core
的模块名称是 org.hibernate.orm.core
;hibernate-c3p0
的模块名称是 org.hibernate.orm.c3p0
;等等。
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() {...}
...
}