Hibernate.org社区文档

第 4 章 元模型

4.1. 静态元模型

注意

元模型本身在 [JPA 2 规范] 的第 5 章 元模型 API 中进行了描述。[JPA 2 规范] 的第 6 章 标准 API 描述并演示了在标准查询中使用元模型,第 9 章标准查询 也是如此。

元模型是一组描述领域模型的对象。javax.persistence.metamodel.Metamodel 充当这些元模型对象存储库,并提供对它们的访问,并且可以通过 getMetamodel 方法从 javax.persistence.EntityManagerFactoryjavax.persistence.EntityManager 获得。

此元模型在两个方面很重要。首先,它允许供应商和框架以通用方式处理应用程序的领域模型。持久性供应商已经具有一些元模型形式,用于描述正在映射的领域模型。然而,此 API 定义了对现有信息的单一、独立访问。例如,验证框架可以使用这些信息来理解关联;编组框架可能会使用这些信息来决定编组多少实体图形。此用法超出了本文档的范围。

重要提示

截至今天,JPA 2 元模型不提供任何用于访问与物理模型相关的关系信息的功能。预计将在规范的未来版本中解决此问题。

其次,从应用程序作者的角度来看,它允许非常流畅地表达完全类型安全的条件查询,特别是静态元模型方法。[JPA 2 规范] 定义了访问和使用元模型的多种方式,包括我们将稍后研究的静态元模型方法。静态元模型方法 在代码对域模型具有先验知识时非常有用。在 第 9 章,标准查询 中其示例中专门使用了这种方法。

静态元模型 表示一系列“反映”域模型中实体和嵌入式的类,并提供对镜像类属性的元数据静态访问。我们专门讨论 [JPA 2 规范] 中称为规范元模型 的内容。

 

  • 对于包 p 中的每个受管理的类 X,将创建包 p 中的元模型类 X_

  • 元模型类的名称是通过在受管理的类名称后面附加“_” 从受管理的类名称派生的。

  • 元模型类 X_ 必须使用注释 javax.persistence.StaticMetamodel [1] 进行注释

  • 如果类 X 扩展另一个类 S,其中 S 是类 X 扩展的最派生的受管理的类(即实体或映射超类),那么类 X_ 必须扩展类 S_,其中 S_ 是为 S 创建的元模型类。

  • 对于类 X 声明的每个持久非集合值属性 y,其中 y 的类型为 Y,元模型类必须包含如下声明

    public static volatile SingularAttribute<X, Y> y;

  • 对于类 X 声明的每个持久集合值属性 z,其中 z 的元素类型为 Z,元模型类必须包含如下声明

    • 如果 z 的集合类型为 java.util.Collection,那么

      public static volatile CollectionAttribute<X, Z> z;

    • 如果 z 的集合类型是 java.util.Set,那么

      public static volatile SetAttribute<X, Z> z;

    • 如果 z 的集合类型是 java.util.List,那么

      public static volatile ListAttribute<X, Z> z;

    • 如果 z 的集合类型是 java.util.Map,那么

      public static volatile MapAttribute<X, K, Z> z;

      其中 K 是类 X 中的映射的键的类型

应根据需要 javax.persistence.metamodel 所需类型(例如 javax.persistence.metamodel.SingularAttributejavax.persistence.metamodel.CollectionAttributejavax.persistence.metamodel.SetAttributejavax.persistence.metamodel.ListAttributejavax.persistence.metamodel.MapAttribute)和所有类 XYZK 的导入语句。

 
 -- [JPA 2 规范,第 6.2.1.1 节,第 198-199 页]

注意

如果您愿意,可以手动生成这些规范元模型类,但预计大多数开发人员会更喜欢使用注释处理器。注释处理器本身超出了本文档的范围。但是,Hibernate 团队确实开发了一个注释处理器工具,用于生成规范元模型。请参阅Hibernate 元模型生成器

在构建 Hibernate EntityManagerFactory 时,它将为每个已知的受管类型化的元模型类查找规范元模型类,如果发现任何元模型类,它将把适当的元模型信息注入到其中,如 [JPA 2 规范,第 6.2.2 节,第 200 页] 中所述



[1] (来自原件)如果生成了该类,则应使用 javax.annotation.Generated 注释对该类进行注释。在静态元模型类上使用任何其他注释是未定义的。