JPA中复合主键的映射

JPA中复合主键的映射
2011年07月01日
  在航空系统中,航线有出发城市和到达城市复合主键确定 一个航线可以有多个航班 所以航班对航线是多对一的关系。维护端为航班。由于航线的主键为复合主键,在航班类中要引用航线的主键做为外键 该怎么使用呢?下面是用法:
  1、创建复合主键类
  需要实现序列化接口和重写hashcode和equals方法
  Jpa注解的用法见代码吧: package cn.itcast.bean; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Embeddable; @Embeddable public class AirLinePK implements Serializable{//JPA叫它作主键类 private String startcity; private String endcity; public AirLinePK(){} public AirLinePK(String startcity, String endcity) { this.startcity = startcity; this.endcity = endcity; } @Column(length=3)//国际上城市代码使用三字码 public String getStartcity() { return startcity; } public void setStartcity(String startcity) { this.startcity = startcity; } @Column(length=3) public String getEndcity() { return endcity; } public void setEndcity(String endcity) { this.endcity = endcity; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((endcity == null) ? 0 : endcity.hashCode()); result = prime * result + ((startcity == null) ? 0 : startcity.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final AirLinePK other = (AirLinePK) obj; if (endcity == null) { if (other.endcity != null) return false; } else if (!endcity.equals(other.endcity)) return false; if (startcity == null) { if (other.startcity != null) return false; } else if (!startcity.equals(other.startcity)) return false; return true; } }
  2、创建航线类 package cn.itcast.bean; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.EmbeddedId; import javax.persistence.Entity; import javax.persistence.OneToMany; @Entity public class AirLine { private AirLinePK id; private Boolean onpp = true; //是否在飞 private Set filghts = new HashSet(); @OneToMany(mappedBy="airLine", cascade=CascadeType.REFRESH) public Set getFilghts() { return filghts; } public void setFilghts(Set filghts) { this.filghts = filghts; } public AirLine(){} public AirLine(AirLinePK id) { this.id = id; } public AirLine(String startcity, String endcity) { this.id = new AirLinePK(startcity, endcity); } @EmbeddedId //复合主键的注解方法 public AirLinePK getId() {//必须实现序列化接口 return id; } public void setId(AirLinePK id) { this.id = id; } @Column(nullable=false) public Boolean getOnoff() { return onpp; } public void setOnoff(Boolean onoff) { this.onpp = onoff; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final AirLine other = (AirLine) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } }
  3、航班的代码 package cn.itcast.bean; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinColumns; import javax.persistence.ManyToOne; @Entity public class Filght { private String filghtno; private String aircompany; private AirLine airLine; @ManyToOne(cascade=CascadeType.REFRESH, optional=false) @JoinColumns({//设置外键的名称和各自对应的外键类里的属性。想想加入不设置,程序怎么知道谁对应谁呀 @JoinColumn(name="startcity", referencedColumnName="startcity"), @JoinColumn(name="endcity", referencedColumnName="endcity") }) public AirLine getAirLine() { return airLine; } public void setAirLine(AirLine airLine) { this.airLine = airLine; } @Id @Column(length=6) public String getFilghtno() { return filghtno; } public void setFilghtno(String filghtno) { this.filghtno = filghtno; } @Column(length=2) public String getAircompany() { return aircompany; } public void setAircompany(String aircompany) { this.aircompany = aircompany; } }
  测试代码 @Test public void save(){ EntityManagerFactory factory = Persistence.createEntityManagerFactory("itcast"); EntityManager em = factory.createEntityManager(); em.getTransaction().begin(); AirLine airLine = new AirLine("PEK", "CAN"); em.persist(airLine); Filght filght = new Filght(); filght.setFilghtno("CA1002"); filght.setAircompany("CA"); filght.setAirLine(airLine); em.persist(filght); em.getTransaction().commit(); em.close(); factory.close(); }
  
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值