一。联合主键
mysql的联合主键:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。
二。联合主键的实现
1.将联合主键的字段单独放在一个类中,该类需要重写equals和hashcode方法。
2.在主类中(该类包含联合主键类中的字段)将联合主键字段都注解为@Id。
3.最后在该类上加上注解:@IdClass(联合主键类.class),用来关联主键类。
teacher类
@Entity
@Table(name="teacher")
//联合主键
@IdClass(TeacherPK.class)
public class Teacher {
private int id;
private String name;
private String title;
private String yourWifeName;
private Date birthDay;
private ZheCheng ZheCheng;
//枚举的映射
@Enumerated(EnumType.STRING)
public ZheCheng getZheCheng() {
return ZheCheng;
}
public void setZheCheng(ZheCheng zheCheng) {
ZheCheng = zheCheng;
}
//将date的时间和日期分开
@Temporal(TemporalType.DATE)
public Date getBirthDay() {
return birthDay;
}
public void setBirthDay(Date birthDay) {
this.birthDay = birthDay;
}
//不需要写到数据库中的字段
@Transient
public String getYourWifeName() {
return yourWifeName;
}
public void setYourWifeName(String yourWifeName) {
this.yourWifeName = yourWifeName;
}
@Id
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
// //字段名和属性名不一样
// @Column(name="_name")
@Id
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
teacherPK类
package com.hibernate.model;
import java.io.Serializable;
//内存满了或系统集群时,服务器发生问题,需要将这台服务器的对象写到另外一台时
//需要实现序列。
public class TeacherPK implements Serializable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//保证主键相同
@Override
public boolean equals(Object obj) {
if(obj instanceof TeacherPK){
TeacherPK pk = (TeacherPK) obj;
if(this.id==pk.getId()&&this.name.equals(pk.getName())){
return true;
}
}
return false;
}
//当对象的一部分内容装在hash表中,首先要查hash表。
@Override
public int hashCode() {
// TODO Auto-generated method stub
return this.name.hashCode();
}
}