hibernate的@EmbeddedId嵌入式主键详解
一.前言
在我们的日常开发中,有时候会用到数据库进行设计的时候,采用了复合主键来来保证唯一性,下面介绍一下采用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;
}
}

浙公网安备 33010602011771号