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;
	}
}   
posted @ 2016-06-19 21:53  独具匠心  阅读(9775)  评论(1编辑  收藏  举报