JPA初探07---联合主键的使用
程序员文章站
2022-04-25 07:55:44
...
联合主键:一般是两个或者以上的字段来标示主键,在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();
}
}
下一篇: 399元小蚁运动相机上手评测视频