JPA初探07---联合主键的使用

联合主键:一般是两个或者以上的字段来标示主键,在JPA中把所有的联合主键的字段放在同一个类中。

那么Java类的设计:专门设计一个类,用来存放联合主键字段,而且该类只能存放联合主键字段。


【联合主键类设计】
package 联合主键;

import java.io.Serializable;

import javax.persistence.Embeddable;

/**
 * 联合主键类(航线的联合主键类,连个点为一线)
 * @author 青山
 * @date 2014年10月20日
 * @file name: AirWayPK.java
 * @Desc 本类只能存放联合主键字段,类中字段的定义也只能定义用作主键的字段
 * JPA联合主键规范:1. 必须要有无参构造方法
 * 			   2. 必须实现serializable接口
 * 			   3. 必须重写hashCode()和equals()方法
 * 本类作为实体类的主键类,包含了两个具体的主键字段
 */
//该注解用在实体里面,告诉JPA实现产品我使用复合主键类的属性来
@Embeddable   //英文翻译:嵌入的  我理解为将本类嵌入到实体类中做主键使用
public class AirWayPK implements Serializable{
	
	private static final long serialVersionUID = 2307150430118066404L;

	private String startPoint;
	
	private String endPoint;
	
	public AirWayPK(String startPoint, String endPoint) {
		super();
		this.startPoint = startPoint;
		this.endPoint = endPoint;
	}
	public AirWayPK() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getStartPoint() {
		return startPoint;
	}
	public void setStartPoint(String startPoint) {
		this.startPoint = startPoint;
	}
	public String getEndPoint() {
		return endPoint;
	}
	public void setEndPoint(String endPoint) {
		this.endPoint = endPoint;
	}
	@Override
	public int hashCode() {
		final int prefix = 33;
		int result = 2;
		result = prefix * result+(startPoint==null ? 0 : startPoint.hashCode());
		result = prefix * result+(endPoint==null ? 0 : endPoint.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if(this == obj) return true;
		if(obj==null) return false;
		if(this.getClass() != obj.getClass()) return false;
		AirWayPK aw = (AirWayPK)obj;
		if(endPoint==null){
			if(aw.getEndPoint()!=null){
				return false;
			}
		}else if(!endPoint.equals(aw.getEndPoint())){
			return false;
		}
		if(startPoint==null){
			if(aw.getStartPoint()!=null){
				return false;
			}
		}else if(!startPoint.equals(aw.getStartPoint())){
			return false;
		}
		return true;
	}
}


【实体类设计】
package 联合主键;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
 * 
 * @author 青山
 * @date 2014年10月20日
 * @file name: AirWay.java
 * 
 * 表设计:
 * 	 CREATE TABLE `world`.`t_airline` (
	   `startpoint` VARCHAR(40) NOT NULL,
	   `endpoint` VARCHAR(40) NOT NULL,
	   `linename` VARCHAR(45) NULL,
	  PRIMARY KEY (`startpoint`, `endpoint`));
 * 
 */
@Entity
@Table(name="t_airline")
public class AirWay {
	@EmbeddedId  //标注awid为实体的标识符
	private AirWayPK awid; //这里使用联合主键类来标示航线的主键
	
	@Column(name="linename")
	private String airLineName;

	public AirWay() {
		super();
		// TODO Auto-generated constructor stub
	}

	public AirWay(AirWayPK awid, String airLineName) {
		super();
		this.awid = awid;
		this.airLineName = airLineName;
	}

	public AirWayPK getAwid() {
		return awid;
	}

	public void setAwid(AirWayPK awid) {
		this.awid = awid;
	}

	public String getAirLineName() {
		return airLineName;
	}

	public void setAirLineName(String airLineName) {
		this.airLineName = airLineName;
	}
	
	
}


【测试】

package 联合主键;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import util.JPAManagerFactory;

public class TestCompositePK {
	public static void main(String[] args) {
		EntityManager manager = JPAManagerFactory.getMFInstance().getManager();
		EntityTransaction t = manager.getTransaction();
		t.begin();
		
		AirWayPK pk = new AirWayPK("CHENGDU","SHANGHAI");
		AirWay aw = new AirWay(pk,"成都飞上海");
		
		manager.persist(aw);
		
		t.commit();
		manager.close();
	}
}

 

你可能感兴趣的:(联合主键)