JPA 联合主键
程序员文章站
2022-02-12 21:23:55
...
/**
* 联合主键
*
* 1、必须实现Serializable序列化 2、必须提示无参的构造方法 3、必须重写hashCode和equals方法
*
* @Embeddable 表示该类中所有属性在应用该联合主键的类中作为它的属性(字段)
* @author 张明学
*
*/
@Embeddable
public class AirLinePK implements Serializable {
private String staCity;
private String endCity;
public AirLinePK() {
}
public AirLinePK(String staCity, String endCity) {
this.staCity = staCity;
this.endCity = endCity;
}
@Column(nullable = false, length = 32)
public String getStaCity() {
return staCity;
}
public void setStaCity(String staCity) {
this.staCity = staCity;
}
@Column(nullable = false, length = 32)
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 + ((staCity == null) ? 0 : staCity.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 (staCity == null) {
if (other.staCity != null)
return false;
} else if (!staCity.equals(other.staCity))
return false;
return true;
}
}
该联全主键的应用:
@Entity
@Table(name = "AIRLINE")
public class AirLineEntity {
private AirLinePK a_id;
private String a_name;
// 联合主键
@EmbeddedId
public AirLinePK getA_id() {
return a_id;
}
public void setA_id(AirLinePK a_id) {
this.a_id = a_id;
}
@Column(length = 50)
public String getA_name() {
return a_name;
}
public void setA_name(String a_name) {
this.a_name = a_name;
}
}
测试:
public class CompositePKTest {
@Test
public void save(){
EntityManagerFactory factory = Persistence.createEntityManagerFactory("mengya");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
AirLineEntity airLine = new AirLineEntity();
airLine.setA_id(new AirLinePK("BeJing","ShangHai"));
airLine.setA_name("北京至上海");
em.persist(airLine);
em.getTransaction().commit();
em.close();
factory.close();
}
}