JPA 2 定义了一个类型安全的 Criteria
API,它允许以强类型化的方式构造查询条件,类型安全则是利用元模型对象实现的。对于开发者而言,元模型生成的自动化非常重要。Hibernate 静态元模型生成器是一个基于 [可插入式批注处理 API] 的批注处理器,用于创建 JPA 2 静态元模型类。以下示例展示了两个 JPA 2 实体 Order
和 Item
,以及元模型类 Order_
和类型安全查询。
示例 1.2. 元模型类 Order_
@StaticMetamodel(Order.class)
public class Order_ {
public static volatile SingularAttribute<Order, Integer> id;
public static volatile SingularAttribute<Order, Customer> customer;
public static volatile SetAttribute<Order, Item> items;
public static volatile SingularAttribute<Order, BigDecimal> totalCost;
}
示例 1.3. 类型安全准则查询
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Order> cq = cb.createQuery(Order.class);
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items);
cq.where( cb.equal(itemNode.get(Item_.id), 5 ) ).distinct(true);
元模型生成器还考虑 orm.xml 中指定的 xml 配置或在 persistence.xml 中指定的映射文件。但如果所有配置都采用 XML,则需要在至少一个映射文件中添加以下持久单元元数据
<persistence-unit-metadata> <xml-mapping-metadata-complete/> </persistence-unit-metadata>
元模型类的结构在 [JPA 2 规范] 中进行了描述,但为了内容完整起见,将在以下段落中重复该定义。如果您对血腥的细节不感兴趣,请随时跳到 第 2 章,用法。
注释处理器针对持久性单元中的每个托管类生成基于以下规则的元模型类
对于包 p 中的每个受管类 X
,创建一个包 p 中的元模型类 X_
。
元模型类的名称派生自受管类的名称,方法是向受管类的名称追加“_”。
元模型类 X_
必须使用 javax.persistence.StaticMetamodel
注解进行注释。
如果类 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
类型以及所有类 X
、Y
、Z
和 K
包含导入语句。
版权所有 © 2010 Red Hat Inc.