快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19
义特征。类似地,可以通过接口(比如 SingularAttribute、CollectionAttribute 和 MapAttribute)在类型定义级别上区分持久化属性。

除了方便描述之外,这些专门化的元模型接口还有实用优势,能够帮助构建类型安全的查询从而减少运行时错误。您在前面的例子中看到了一部分优势,随着我通过 CriteriaQuery 描述关于连接的例子,您将看到更多优势。

运行时作用域

一般而言,可以将 Java Reflection API 的传统接口与专门用于描述持久化元数据的 javax.persistence.metamodel 的接口进行比较。要进一步进行类比,则需要对元模型接口使用等效的运行时作用域概念。java.lang.Class 实例的作用域由 java.lang.ClassLoader 在运行时划分。一组相互引用的 Java 类实例必须在 ClassLoader 作用域下定义。作用域的边界是严格 或封闭 的,如果在 ClassLoader L 作用域下定义的类 A 试图引用不在 ClassLoader L 作用域之内的类 B,结果将收到可怕的 ClassNotFoundException 或 NoClassDef FoundError(对于处理包含多个 ClassLoader 的环境的开发人员或部署人员而言,问题就复杂了)。

现在将一组严格的可相互引用的类称为运行时作用域,而在 JPA 1.0 中称为持久化单元。持久化单元作用域的持久化实体在 META-INF/persistence.xml 文件的 <class> 子句中枚举。在 JPA 2.0 中,通过 javax.persistence.metamodel.Metamodel 接口让开发人员可以在运行时使用作用域。Metamodel 接口是特定持久化单元知道的所有持久化实体的容器,如图 5 所示:

图 5. 元模型接口是持久化单元中的类型的容器

这个接口允许通过元模型元素的对应持久化实体类访问元模型元素。例如,要获得对 Person 持久化实体的持久化元数据的引用,可以编写:

EntityManagerFactory emf = ...; Metamodel metamodel = emf.getMetamodel(); EntityType<Person> pClass = metamodel.entity(Person.class);

这是一个用类的名称通过 ClassLoader 获得 Class 的类比:

ClassLoader classloader = Thread.currentThread().getContextClassLoader(); Class<?> clazz = classloader.loadClass("domain.Person");

可以在运行时浏览 EntityType<Person> 获得在 Person 实体中声明的持久化属性。如果应用程序在 pClass(比如 pClass.getSingularAttribute("age", Integer.class))上调用一个方法,它将返回一个 SingularAttribute<Person, Integer> 实例,该实例与实例化规范元模型类的静态 Person_.age 成员相同。最重要的是,对于应用程序可以通过 Metamodel API 在运行时引用的属性,是通过实例化静态规范元模型 Person_ 类向 Java 编译器提供的。

除了将持久化实体分解为对应的元模型元素之外,Metamodel API 还允许访问所有已知的元模型类 (Metamodel.getManagedTypes()),或者通过类的持久化信息访问元模型类,例如 embeddable(Address.class),它将返回一个 EmbeddableType<Address> 实例(ManagedType<> 的子接口)。

在 JPA 中,关于 POJO 的元信息使用带有源代码注释(或 XML 描述符)的持久化元信息进一步进行区分 —— 比如类是否是嵌入的,或者哪个字段用作主键。持久化元信息分为两大类:持久化(比如 @Entity)和映射(比如 @Table)。在 JPA 2.0 中,元模型仅为持久化注释(不是映射注释)捕捉元数据。因此,使用当前版本的 Metamodel API 可以知道哪些字段是持久化的,但不能找到它们映射到的数据库列。

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

时间:2011-02-03 IBM Pinaki Poddar

规范和非规范

尽管 JPA 2.0 规范规定了规范的静态元模型类的精确样式(包括元模型类的完

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号