快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

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

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

难道为了应用 SINGLE_TABLE 就不得不丢弃字段的约束条件么? @Required 就应运而生 了,定义如清单 10。@Required 被用来标记 p1,p2 不能为 null。

就需要在我们自己的程序里面检测 @Required,并对相应的属性值进行判断。这一步通常 可以放在 EntityListener 中的 PrePersist 这个回调(Callback)函数中进行检测。

清单 10. @Required 的定义

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

在 OnlineGame Class 中,可以通过如下清单 11 所示方式设置属性 ServiceProvider:

清单 11. 应用 @Required

@Column(name="",nullable=true) @Basic @Required private String ServiceProvider;

数据库不再对 ServiceProvider 是否为空做出约束,但是通过实现标记为 @prePresist 的回调函数,函数中检测是否有 @Required,如果有 @Required,该字段就不能为空。如此 ServiceProvider 的约束条件就不会再成为约束类 PCGame 的条件。

@RelationshipMetaData

在 OpenJPA 中,有四个 Annotation 可以用来标识一个实体之间的关系,它们分别是: @OneToOne,@OneToMany,@ManyToOne 和 @ManyToMany。其中每一个 Annotation 都有以下 几个属性:targetEntity,mappedBy,cascade,fetch 和 optional。

图 2. 实体 Employee 和 SoftwareLicense 的 ER 图

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

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

尽管包括了一对一、一对多和多对多的情况,但是为了将图 2 所示 ER 关系图映射到关 系数据库,以上的 Annotation 就不能满足要求。图 2 的关系 Owns 是一个多对多的关系, Owns 包括了两个属性 RequestDate 和 ExpiredDate,Owns 必须对应到一个实体类。类 Employee、SoftwareLicense 和 Owns 之间分别存在着多对一的关系,@ManytoOne 或者 @OnetoMany 虽然能够标识出关系,但是并不能标识出关系的源或者目的是一个实体还是关系 ,@RelationshipMetaData 就有了用武之地,其定义如清单 12 所示:

清单 12. @RelationshipMetaData 的定义

@Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface RelationshipMetaData {    boolean isSource();    boolean isManyToManyWithProperties(); }

有了 @RelationshipMetaData,图 2 对应的实体就可以被定义为:

清单 13. 应用 @RelationshipMetaData 实现图 2 的 OR 映射

@Table(name="Employee") @Entity(name="Employee") public class Employee {    …    @RelationshipMetaData(isSource=true,isManyToManyWithProperties=true)    @OneToMany(mappedBy=”Source”)    private java.util.Collection<Employee_owns_SoftwareLicense>  owns_SoftwareLicense;    … }; @Table(name="SoftwareLicense") @Entity(name="SoftwareLicense") public class SoftwareLicense{    …    @RelationshipMetaData(isSource=false,isManyToManyWithProperties=true)    @OneToMany(mappedBy=”Target”)    private java.util.Collection<Employee_owns_SoftwareLicense>  Employee_owns;    … } @Table(name=" Employee_owns_SoftwareLicense ") @Entity(name=" Employee_owns_SoftwareLicense ") public class Employee_own

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