快速业务通道

使用JPA和Hibernate实现组合键 - 编程入门网

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

使用JPA和Hibernate实现组合键

时间:2011-01-28 IBM Stephen B. Morris

问题定义

本技巧从问题的简单的描述开始:定义组合数据库键。这个键组合了多列,唯一地定义一个数据库表的行。有时,组合键也称为自然键 或业务键。某些时候使用组合键的原因是所选键在某些方面与最终用户的业务领域相关联。要定义组合键,只需从该领域中选择一些属性,并将其组合在一起,提供所需的行唯一性程度。组合键的缺点是设计和编码略有难度。此外,组合键倾向于将您的数据库和 ORM 设计绑定到原始领域。后者可能会成为严重的问题。

实体代码

清单 1 展示了一个名为 BillingAddress 的 Java 类。该类建模一名个人或一个组织的账单邮寄地址。账单本身与另一个名为 PurchaseOrder 的 Java 类关联。这里并没有什么出人意料之处 — 下置购买订单,接下来进行账单邮寄流程。

清单 1. BillingAddress 类

import javax.persistence.*; import java.io.Serializable; @Embeddable public class BillingAddress implements Serializable {    private String street;    private String city;    BillingAddress() {}    public BillingAddress(String street, String city) {      this.street = street;      this.city = city;    }    public String getStreet() {      return street;    }    private void setStreet(String street) {      this.street = street;    }    public String getCity() {      return city;    }    private void setCity(String city) {      this.city = city;    } }

这里有必要说明一个要点,该类实现了 Java Serializable 接口。另外还要注意带有注释 @Embeddable 的一行。此注释是组合键拼图中的第一块。带有 @Embeddable 注释的 Java 类本身可作为其他类的子组件。这听起来似乎有点复杂,而实际并非如此。作为演示,清单 2 展示了 PurchaseOrder 类,它使用清单 1 中的 BillingAddress 类。

使用JPA和Hibernate实现组合键(2)

时间:2011-01-28 IBM Stephen B. Morris

清单 2. PurchaseOrder 类

import javax.persistence.*; @Entity @Table(name = "PURCHASE_ORDERS") @IdClass(BillingAddress.class) public class PurchaseOrder {   PurchaseOrder() {}   PurchaseOrder(BillingAddress billingAddress) {   street = billingAddress.getStreet();   city = billingAddress.getCity();   }   @Id   @AttributeOverrides({   @AttributeOverride(name = "street",   column = @Column(name="STREET")),   @AttributeOverride(name = "city",   column = @Column(name="CITY"))   })   private String street;   private String city;   private String itemName;   public String getItemName() {   return itemName;   }   public void setItemName(String itemName) {   this.itemName = itemName;   } }

注释总是有些难以理解,清单 2 也不例外。因此,我会将其拆分成便于管理的块。第一个注释是 @Entity,指明该类是一个数据库实体(也就是说,它将构成 ORM 解决方案的一部分)。通常,看到 @Entity 注释就等于看到了对应的数据库表。后者由清单 2 中名为 @Table 的相应注释表明。我发现,以这种方式拆分程序更容易理解。

清单 2 中的下一个注释是 @IdClass,它定义组合键类引用。您可能已经注意到了,该类引用清单 1 中的 BillingAddress 类

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