hibernate的@EmbeddedId嵌入式主键详解

Posted 独具匠心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
	}
}   

以上是关于hibernate的@EmbeddedId嵌入式主键详解的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate Envers 如何通过 EmbeddedId 的属性获取修订

如何使用 Spring Data / Hibernate 级联保持 @OneToMany 与 @EmbeddedId 的关系

如何在 jpa 中为 EmbeddedId 编写选择命名查询?

Hibernate Validator:hbm2ddl 忽略 EmbeddedId 约束

休眠:@EmbeddedId、继承和@SecondaryTable

hibernate 两个外键作为主键(注解方式)