快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
terface MaximumValue {    String value(); } @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface MinimumValue {    String value(); }

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

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

清单 6. 应用 @Maximium 和 @Minimium

@Entity @EntityListeners(value = { TestMaxMinListener.class }) public class TestMaxMin {    @Basic    @MinimumValue("1")    @MaximumValue("100")    public Integer value; }

@MaximiumValue 和 @MinimiumValue 被应用于 Java 类的域中。

与 3.1 类似,在这里设置了回调函数所在的类 TestMaxMinListener,函数如清单 7 所 示:

清单 7. 处理 @ MaximiumValue 和 @MinimiumValue 的回调函数

public class TestMaxMinListener {    @PrePersist    public void prePersist(Object obj) throws Exception {      TestMaxMin tmm = (TestMaxMin)obj;      Field value = tmm.getClass().getDeclaredField("value");      MaximumValue max = value.getAnnotation(MaximumValue.class);      MinimumValue min = value.getAnnotation (MinimumValue.class);      if (tmm.value > max.value() || tmm.value < min.value ()){        System.out.println("The value property is invalid.");        throw new Exception();      }    } }

这个 TestMaxMinListener 的作用就是检测相应的属性值是否在规定的范围内,如果超出 了规定的范围,那么就会抛出异常,从而防止将错误的数据存入数据库中。

@Unsigned

与上面的情况相同,对于某些属性的值,我们希望它是一个无符号整形数。而在 OpenJPA 中也没有相关的 Annotation 来指定。可以自定义一个 Annottation:@Unsigned 用来表示 某个属性的值是无符号数。

清单 8. @Unsigned 的定义

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

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

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

在 Entity Class 当中可以直接把 @Unsigned 设置在相应的属性前面 , 如清单 9 所示 :

清单 9. 应用 @Unsigned

@Unsigned @Basic private Integer value;

@Unsigned 的处理方式和 @MaximiumnValue 类似,这里就不再一一赘述。

@Required

数据库对表中的各项字段可以定义限制条件,如某些字段不能为空,某些字段为主键等。 OpenJPA 定义的 @Column 中提供了字段以限制条件的映射,参考清单 11 中 @Column,将 nullable 设置为 false 来控制字段不能为空。

但是在图 1 所示的应用中,OnlineGame.ServiceProvider 不能为 null,同时必须 SINGLE_TABLE 的继承策略(参照表 1)来映射这一组类,如果仅仅应用 @Column 的 nullable 属性,我们将不得不面临这样一个问题:当试图持久化一个 PCGame 的实例到数据 库中时,数据库系统将会提示该数据不能插入,因为数据系统对插入表 1 中的数据要求 ServiceProvider 不能为空。

图 1. 类图

表 1 . 用 SINGLE_TABLE 在 DB 中存储 Game,OnlineGame 和 PCGame

Game 的属性 OnlineGame 的属性 PCGame 的属性
Name Version Type ServiceProvider

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