2012年2月17日星期五

NetBeans_017:使用JPA实现多主键映射

开发环境:NetBeans 7.1。
我在《开发JavaEE 6 应用之十四:使用CDI Event实现观察者模式》基础上使用JPA实现多主键映射。

1. 创建多主键表:COMPOSITE_CUSTOMER
打开项目JavaEE6SampleApp,切换到服务Tab,选择数据库节点,右键 jdbc:derby://localhost:1527/sample [Appshang的app],选择连接。
在SQL窗口输入:
DROP TABLE COMPOSITE_CUSTOMER;

CREATE TABLE COMPOSITE_CUSTOMER
(
  FIRST_NAME VARCHAR(10), 
  LAST_NAME VARCHAR(10),  
  Mobile_Phone int,
  ADDRESS VARCHAR(100),
  CONSTRAINT COMPOSITE_CUSTOMER_PK PRIMARY KEY 
  (
    FIRST_NAME, LAST_NAME 
  )
)


2. 创建多主键表:COMPOSITE_CUSTOMER
具体步骤与《开发JavaEE 6 应用之三:创建JPA实体》类似。
不过,完成后,会生成两个Java文件:

2.1 多主键类:CompositeCustomerPK.java
多主键类要求:
(1)要有无参构造方法。
(2)要实现序列化接口
(3)Override hashCode方法和equals方法
其中,类标注@Embeddable表明该类不是一个实体,而是嵌入别的实体中的一个属性。

2.2 JPA实体类:CompositeCustomer.java

3. 修改CustomerSessionBean,增加addCompositeCustomer方法
public void addCompositeCustomer(String firstName,
   String lastName, Integer mobilePhone, String address) {
   CompositeCustomer cc = new CompositeCustomer(firstName, lastName);
   cc.setMobilePhone(1234567890);
   cc.setAddress(address);
   em.persist(cc);
}


4. 修改TestServlet,增加addcc操作处理
 String ccid = request.getParameter("addcc");
            if (ccid != null) {
                bean.addCompositeCustomer("Ping" + ccid, "Ma" + ccid, 1234567890, "China Beijing");
                ...
            }


5. 运行TestServlet
在TestServlet后面增加参数:http://localhost:8080/JavaEE6SampleApp/TestServlet?addcc=100
检查数据库,发现COMPOSITE_CUSTOMER表中增加了新的数据。


Project下载:JavaEE6SampleApp(CompositeKey).7z

参考文献:
1. http://stackoverflow.com/questions/4705088/jpa-2-multiple-column-usage-in-foreign-keys
2. http://weblogs.java.net/blog/bleonard/archive/2006/11/using_composite.html
3. http://jerval.iteye.com/blog/875826
4. http://melin.iteye.com/blog/197217

没有评论: