快速业务通道

如何扩展JPA Annotation以更好的支持OR Mapping - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
OperatingSystem") @Category(value="System") @Inheritance(strategy=InheritanceType.JOINED) public class OperatingSystem extends System{ … /**     * A string describing the operating system version number.     */    @Column(name="OSVersion",length=64)    @Basic    private String OSVersion; … }

扩展的 annotation 及其使用

在实际应用中,JPA 已有的 annotation 往往不能满足 OR 映射的所有需求。以下介绍通 过自定义 Annotation 来扩充 OpenJPA 功能的方法,从而可以更好满足实际应用的需求。

@AbstractWithTable

在 OpenJPA 中,针对实体之间的继承关系如何在数据库中展现,共有三种方式:

SINGLE_TABLE,TABLE_PER_CLASS 和 JOINED。

当应用程序使用 TABLE_PER_CLASS 这种方式时,Java 的抽象类(Abstract Class)在 OpenJPA 中不会被映射到数据库中的表项,同时抽象性阻止了用户不能通过 OpenJPA 直接对 该类进行持久化的操作。有些应用需要保持一个类在持久化操作方面的抽象性,但是又能保 证该类在数据库中有对应的表项。那么该类必须被定义为 Java 的具体类,同时引入 @AbstractWithTable(如清单 2):

清单 2. @AbstractWithTable 的定义

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface AbstractWithTable { }

如何扩展JPA Annotation以更好的支持OR Mapping(3)

时间:2011-04-19 IBM 周蕾蕾 胡光辉 赵 成

@AbstractWithTable 的使用方式如清单 3 所示:

清单 3. 应用 @AbstractWithTable 定义实体类

@AbstractWithTable @Entity @EntityListeners(value = { TestAWTListener.class }) public class TestAWT {    @Basic    public String p; }

从清单 3 中可见,除了 @Entity 之外,@AbstractWithTable 和 @EntityListeners 也 被应用到类 TestAWT 中。其中 @AbstarctWithTable 就是用来指定这个抽象类需要一个数据 库表,同时类 TestAWT 并没有使用 abstract 这个 Java 关键字。

OpenJPA 提供了 @EntityListeners 指定进行持久化操作前后的回调函数。定义 TestAWT 的回调函数如下清单 4 所示。

清单 4. 处理 @AbstractWithTable 的回调函数

public class TestAWTListener {    @PrePersist    public void prePersist(Object obj) throws Exception{      AbstractWithTable awt = obj.getClass().getAnnotation (AbstractWithTable.class);      if (awt != null) {        System.out.println("abstract class cannot be persisted");        throw new Exception();      }    } }

在回调函数中检测相关对象是否设置了 @AbstractWithTable,如果 @AbstractWithTable 被应用到某个类,异常将被抛出来从而阻止将此对象存入数据库中。这样通过 @AbstractWithTable 和回调函数就达到了控制类的 JPA 的持久化操作权限和该类能映射到 数据库的表项的目的。

@MaximumValue 和 @MinimumValue

数据库中最常见的情况就是对某个字段的取值范围定义约束条件(Constraint),比如学 生的考试成绩取值范围必须在 0 到 100 这个范围内。但是 OpenJPA 没有提供相应的 Annotation 来指定某个属性的取值范围。

为了解决这个问题,自定义的 Annotation:@Maximum 和 @Minimum 被引入,如下清单 5 和 6 所示。它们分别用来表示最大值和最小值。

清单 5. @MaximiumValue 和 @MinimiumValue 的定义

@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @in

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