當(dāng)我們需要使用一個或多個屬性變量(表中的一列或多列)聯(lián)合起來作為主鍵,我們需要使用復(fù)合主鍵。在EJB3.0中復(fù)合主鍵要求我們編寫一個復(fù)合主鍵類(
Composite Primary Key Class )。下面是個小例子,在Student中要用sid和name做復(fù)合主鍵。
Student實體類:
1 import javax.persistence.Column;
2 import javax.persistence.Entity;
3 import javax.persistence.Id;
4 import javax.persistence.IdClass;
5
6 @Entity
7 @IdClass(StudentPK.class)
8 public class Student {
9
10 private String sid;
11 private String name;
12 private String age;
13
14 @Id
15 public String getSid() {
16 return sid;
17 }
18 public void setSid(String sid) {
19 this.sid = sid;
20 }
21
22 @Id
23 public String getName() {
24 return name;
25 }
26 public void setName(String name) {
27 this.name = name;
28 }
29
30 @Column
31 public String getAge() {
32 return age;
33 }
34 public void setAge(String age) {
35 this.age = age;
36 }
37
38 }
主鍵
StudentPK類:
1 import java.io.Serializable;
2
3 public class StudentPK implements Serializable{
4
5 private static final long serialVersionUID = 1L;
6
7 private String sid;
8 private String name;
9
10 public StudentPK(){}
11 public StudentPK(String sid,String name){
12 this.sid = sid;
13 this.name = name;
14 }
15
16 public String getSid() {
17 return sid;
18 }
19 public void setSid(String sid) {
20 this.sid = sid;
21 }
22 public String getName() {
23 return name;
24 }
25 public void setName(String name) {
26 this.name = name;
27 }
28
29 @Override
30 public int hashCode() {
31 final int prime = 31;
32 int result = 1;
33 result = prime * result + ((name == null) ? 0 : name.hashCode());
34 result = prime * result + ((sid == null) ? 0 : sid.hashCode());
35 return result;
36 }
37
38 @Override
39 public boolean equals(Object obj) {
40 if (this == obj)
41 return true;
42 if (obj == null)
43 return false;
44 if (getClass() != obj.getClass())
45 return false;
46 final StudentPK other = (StudentPK) obj;
47 if (name == null) {
48 if (other.name != null)
49 return false;
50 } else if (!name.equals(other.name))
51 return false;
52 if (sid == null) {
53 if (other.sid != null)
54 return false;
55 } else if (!sid.equals(other.sid))
56 return false;
57 return true;
58 }
59
60 }
主鍵類必需滿足下列條件:
(1)必需被序列化
(2)必需有一個公共的無參構(gòu)造方法
(3)必需實現(xiàn)equals()和hashCode()方法
當(dāng)你查詢Student實體時必須使用主鍵類才能識別實體如:
StudentPK pk = new StudentPK("bj1001","jakin");
Student student = entityManager.find(Student.class, pk);
在測試本例時筆者犯了兩個低級的錯誤,一是測試環(huán)境的數(shù)據(jù)庫不是項目運(yùn)行的數(shù)據(jù)庫,二是實體類中的屬性命名用了關(guān)鍵字,請引以為戒。