快速业务通道

JPA 2.0中的动态类型安全查询 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
者能够将这个类的实例作为持久化实体管理。

清单 4 显示了 domain.Person 的对应静态规范元模型类:

清单 4. 一个简单实体的规范元模型

package domain; import javax.persistence.metamodel.SingularAttribute; @javax.persistence.metamodel.StaticMetamodel(domain.Person.class) public class Person_ {   public static volatile SingularAttribute<Person,Long> ssn;   public static volatile SingularAttribute<Person,String> name;   public static volatile SingularAttribute<Person,Integer> age; }

元模型类将原来的 domain.Person 实体的每个持久化属性声明为类型为 SingularAttribute<Person,?> 的静态公共字段。通过利用这个 Person_ 元模型类,可以在编译期间引用 domain.Person 的持久化属性 age — 不是通过 Reflection API,而是直接引用静态的 Person_.age 字段。然后,编译器可以根据 age 属性声明的类型实施类型检查。我已经列举了一个关于此类限制的例子:QueryBuilder.gt(p.get(Person_.age), "xyz") 将导致编译器错误,因为编译器通过 QueryBuilder.gt(..) 的签名和 Person_.age 的类型可以确定 Person 的 age 属性是一个数字字段,不能与 String 进行比较。

JPA 2.0中的动态类型安全查询(5)

时间:2011-02-03 IBM Pinaki Poddar

其他一些需要注意的要点包括:

元模型 Person_.age 字段被声明为类型 javax.persistence.metamodel.SingularAttribute。SingularAttribute 是 JPA Metamodel API 中定义的接口之一,我将在下一小节描述它。SingularAttribute<Person, Integer> 的泛型参数表示该类声明原来的持久化属性和持久化属性本身的类型。

元模型类被注释为 @StaticMetamodel(domain.Person.class) 以将其标记为一个与原来的持久化 domain.Person 实体对应的元模型类。

Metamodel API

我将一个元模型类定义为一个持久化实体类的描述。就像 Reflection API 需要其他接口(比如 java.lang.reflect.Field 或 java.lang.reflect.Method )来描述 java.lang.Class 的组成一样,JPA Metamodel API 也需要其他接口(比如 SingularAttribute 和 PluralAttribute)来描述元模型类的类型及其属性。

图 3 显示了在 Metamodel API 中定义用于描述类型的接口:

图 3. Metamodel API 中的持久化类型的接口的层次结构

图 4 显示了在 Metamodel API 中定义用于描述属性的接口:

图 4. Metamodel API 中的持久化属性的接口的层次结构

JPA 2.0中的动态类型安全查询(6)

时间:2011-02-03 IBM Pinaki Poddar

JPA 的 Metamodel API 接口比 Java Reflection API 更加专业化。需要更细微的差别来表达关于持久化的丰富元信息。例如,Java Reflection API 将所有 Java 类型表示为 java.lang.Class。即没有通过独立的定义对概念进行区分,比如类、抽象类和接口。当然,您可以询问 Class 它是一个接口还是一个抽象类,但这与通过两个独立的定义表示接口和抽象类的差别不同。

Java Reflection API 在 Java 语言诞生时就被引入(对于一种常见的多用途编程语言而言,这曾经是一个非常前沿的概念),但是经过多年的发展才认识到强类型系统的用途和强大之处。JPA Metamodel API 将强类型引入到持久化实体中。例如,持久化实体在语义上区分为 MappedSuperClass、Entity 和 Embeddable。在 JPA 2.0 之前,这种语义区分是通过持久化类定义中的对应类级别注释来表示的。JPA Metamodel 在 javax.persistence.metamodel 包中描述了 3 个独立的接口( MappedSuperclassType、EntityType 和 EmbeddableType ),以更加鲜明的对比它们的语

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号