一.前言
在我們的日常開發中,有時候會用到數據庫進行設計的時候,采用了復合主鍵來來保證唯一性,下面介紹一下采用hibernate的@EmbeddedId嵌入式主鍵。
二.說明
設計一個學生類,包含了三個字段
create tbale student(
stu_no char(11) not null,
stu_name varchar2(30) not null,
stu_class varchar2(20)
)
stu_no : 學號、 stu_name : 姓名 、 stu_class : 班級
把stu_no、stu_name作為復合主鍵
三.studetn 學生類復合主鍵
package com.shine.account.composite.holdportfolio.po;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Embeddable;
/**
* 類說明:studetn 學生類復合主鍵.
*
* NOTE : 符合條件:
* 1.必須實現Serializable
* 2.必須有默認的 public無參數的構造方法、必須覆蓋 equals和 hashCode 方法,這些要求與使用復合主鍵的要求相同
* 3.將嵌入式主鍵類使用 @Embeddable 標注,表示這個是一個嵌入式類。
*
*/
@Embeddable
@SuppressWarnings("serial")
public class StudentId implements Serializable{
/**學號*/
private String stuNo;
/**姓名*/
private String stuName;
public StudentId() {
super();
}
@Column(name = "STU_NO", nullable = false, precision = 11)
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
@Column(name = "STU_NAME", nullable = false)
public String getStuName() {
return stuName;
}
public void setStuName(String stuName) {
this.stuName = stuName;
}
@Override
public boolean equals(Object other) {
if(this == other)
return true;
if(other == null)
return false;
if(!(other instanceof StudentId))
return false;
StudentId otherStudentId = (StudentId) other;
return this.getStuNo() == otherStudentId.stuNo &&
this.getStuName() == otherStudentId.stuNo;
}
@Override
public int hashCode() {
return this.stuNo.hashCode() + this.stuName.hashCode();
}
}
四.po對象(采用java的注解的方式,來注解po)
package com.shine.account.composite.holdportfolio.po;
import java.io.Serializable;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* 類說明:學習實體類.
*/
@Entity
@Table(name = "STUDENT")
@SuppressWarnings("serial")
public class Student implements Serializable{
/**復合主鍵類*/
private StudentId studentId;
/**學生對應班級*/
private String stuClass;
/**
* @EmbeddedId 復合主鍵id
* @AttributeOverrides 屬性映射
*/
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "stuNo", column = @Column(name = "STU_NO", nullable = false, precision = 11)),
@AttributeOverride(name = "stuName", column = @Column(name = "STU_NAME", nullable = false))
})
public StudentId getStudentId() {
return studentId;
}
public void setStudentId(StudentId studentId) {
this.studentId = studentId;
}
@Column(name = "STU_CLASS", nullable = false)
public String getStuClass() {
return stuClass;
}
public void setStuClass(String stuClass) {
this.stuClass = stuClass;
}
}
