3种联合主键方法:
Annotation
i. @Embeddble @Id
ii. @EmbeddedID(*)
iii. @ Id @IdClass(*)
第一种@Embeddble @Id
主键类:TeacherPk类中包含联合主键id,name.这个类必须实行implements Serializable。
import javax.persistence.Embeddable; @Embeddable public class TeacherPk implements Serializable{ private String name; private int id; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
实体bean:Teacher.包含TeacherPk属性,并将get方法设置为@Id
@Entity public class Teacher { private TeacherPk tpk; private String title; private Date birthDate; @Id public TeacherPk getTpk() { return tpk; } public void setTpk(TeacherPk tpk) { this.tpk = tpk; } @Temporal(value = TemporalType.DATE) public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } /* * public String getName() { return name; } */ /* * public void setName(String name) { this.name = name; } */ /* * @Id public int getId() { return id; } * * public void setId(int id) { this.id = id; } */ public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
第二种@EmbeddedId直接放在组件上。去掉TeacherPk的注解
public class Teacher { private TeacherPk tpk; private String title; private Date birthDate; @EmbeddedId public TeacherPk getTpk() { return tpk; } public void setTpk(TeacherPk tpk) { this.tpk = tpk; } @Temporal(value = TemporalType.DATE) public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } /* * public String getName() { return name; } */ /* * public void setName(String name) { this.name = name; } */ /* * @Id public int getId() { return id; } * * public void setId(int id) { this.id = id; } */ public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
但是,在实际的项目中,表中应该有id,name.所有Teacher中应该用getter和setter方法才对。所以,第三种方法,将保留id,name去掉TeacherPk这个组件。
第三种@ Id @IdClass(*)
@Entity @IdClass(value=TeacherPk.class) public class Teacher { private String name; private int id; private String title; private Date birthDate; @Temporal(value = TemporalType.DATE) public Date getBirthDate() { return birthDate; } public void setBirthDate(Date birthDate) { this.birthDate = birthDate; } @Id public String getName() { return name; } public void setName(String name) { this.name = name; } @Id public int getId() { return id; } public void setId(int id) { this.id = id; }
TeacherPk是需要的,在以后查询的时候,需要“主键对象”。