情境描述:學生與成績之間是單向關係,成績由課程編號和開課學期來決定。
1、首先編寫聯合主鍵類。
package com.hibernate._0900_oneToone_uni_fk_composite;import java.util.Date;public class ScorePK implements java.io.Serializable{private String courseID;private Date data; //開課學期public String getCourseID() {return courseID;}public void setCourseID(String courseID) {this.courseID = courseID;}public Date getData() {return data;}public void setData(Date data) {this.data = data;}}
聯合主鍵類必須實現Serializable介面。
2、編寫成績類。
package com.hibernate._0900_oneToone_uni_fk_composite;import java.util.Date;import javax.persistence.Entity;import javax.persistence.Id;import javax.persistence.IdClass;@Entity@IdClass(ScorePK.class)public class Score {private String courseID;private Date data; //開課學期private String courseName;@Idpublic String getCourseID() {return courseID;}public void setCourseID(String courseID) {this.courseID = courseID;}@Idpublic Date getData() {return data;}public void setData(Date data) {this.data = data;}public String getCourseName() {return courseName;}public void setCourseName(String courseName) {this.courseName = courseName;}}
設定@IdClass來指定聯合主鍵類,並將作為聯合主鍵的屬性都註解為@Id。這個類中的聯合主鍵屬性應該和作為聯合主鍵類中的屬性名稱和類型一致。
3、編寫學生類。
package com.hibernate._0900_oneToone_uni_fk_composite;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinColumns;import javax.persistence.OneToOne;@Entitypublic class Student {private Integer id;private String name;private Score score; @Id@GeneratedValuepublic Integer getId() {return id;}public String getName() {return name;}@OneToOne //設定關聯關係@JoinColumns( {@JoinColumn(name="c_id",referencedColumnName="courseID"),@JoinColumn(name="c_name",referencedColumnName="courseName")} )public Score getScore() {return score;}public void setId(Integer id) {this.id = id;}public void setName(String name) {this.name = name;}public void setScore(Score score) {this.score = score;}}
設定關聯關係,可以用@JoinColumns註解來修改屬性在資料庫中對應的欄位名稱。@JoinColumns接受的參數是一個JoinColumn類型的數組,聯合主鍵時,需要用referencedColumnName來指定哪個欄位名對應類中的哪個屬性。