一.前言

在我们的日常开发中,有时候会用到数据库进行设计的时候,采用了复合主键来来保证唯一性,下面介绍一下采用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嵌入式主键详解的更多相关文章

  1. mysql数据库外键、主键详解

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如  学生表(学号,姓名,性别,班级) 其中每个学生的学 ...

  2. Hibernate之:各种主键生成策略与配置详解

    1.assigned 主键由外部程序负责生成,在 save() 之前必须指定一个.Hibernate不负责维护主键生成.与Hibernate和底层数据库都无关,可以跨数据库.在存储对象前,必须要使用主 ...

  3. hibernate集合映射inverse和cascade详解

    hibernate集合映射inverse和cascade详解   1.到底在哪用cascade="..."? cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或 ...

  4. Hibernate的几种主键生成策略

    主键类型: 业务主键(natural key):业务主键的值是来源于一个业务数据. 代理主键(surrogate key):代理主键需要采用一种方式来生成某个唯一值. 代理主键的生成策略: 1.hib ...

  5. Hibernate遇到oracle之主键生成策略

    一直用Hibernate+mysql,感觉Hibernate很好用,也出过什么大问题:这周,公司的产品要部署到Orecle,虽然产品号称支持Oracle但是我自己知道,这个产品压根儿就没在Oracle ...

  6. java框架之Hibernate(2)-持久化类&主键生成策略&缓存&事务&查询

    持久化类 概述 持久化:将内存中的对象持久化到数据库中的过程就是持久化.Hibernate 就是用来进行持久化的框架. 持久化类:一个 Java 对象与数据库的表建立了映射关系,那么这个类在 Hibe ...

  7. 嵌入式linux性能详解_转

    最近简单看了下<嵌入式Linux性能详解>一书,对系统内存分布测试.程序运行.动态库等都很很好的解析. 作者史子旺,loughsky@sina.com. 有时间希望仔细通读,并验证.

  8. Hibernate——(3)主键生成方式

    一.Hibernate中常用的主键生成方式有如下几种: 1)identity: 用于自动生成主键方式,除了 Oracle 不支持,其他数据库一般都支持(较常用) 2)sequence: Oracle ...

  9. (转) Hibernate持久化类与主键生成策略

    http://blog.csdn.net/yerenyuan_pku/article/details/65462930 Hibernate持久化类 什么是持久化类呢?在Hibernate中持久化类的英 ...

随机推荐

  1. 文件夹锁定(Source)

    文件夹锁定(Source)private void Lock(string folderPath){    try    {        string adminUserName = Environ ...

  2. js高级群的一些整理6月

    https://github.com/the5fire/backbonejs-learning-note/blob/master/chapters/01-hello-backbonejs.rst Ba ...

  3. 每秒执行一个shell脚本(转载)

      上周迁移了一台服务器,发现其中一个项目的数据没有更新,查询原服务器的数据,数据有更新,并找到了rsync服务,从其他服务器传输数据,那么如何找到这台服务器?因为是从远程传输到本地,而且不是很频繁, ...

  4. MVC验证session是否过期,在每个action执行之前验证

            protected override void OnActionExecuting(ActionExecutingContext filterContext)         {   ...

  5. PF_INET 和 AF_INET 的区别

    在写网络程序的时候,建立TCP socket: sock = socket(PF_INET, SOCK_STREAM, 0); 然后再绑定本地地址或连接远程地址时需要初始化sockaddr_in结构, ...

  6. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

  7. saltstack(主机改名)

    已存在salt中的机器,为了规范,需要将这批主机改名 操作流程:在master把这批机器剔除:然修改这批机器的主机名.在/etc/salt目录下.用mv把minion_id和pki的目录重命名.重启s ...

  8. Linux 架构

    (转)作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! http://www.cnblogs.com/vamei/archive/2 ...

  9. ecshop常用二次开发修改

    修改ecshop支付宝的支付按钮  http://www.68ecshop.com/article-1081.html 去掉ecshop收货人信息页面的电子邮件必填和电话.手机选填一个  http:/ ...

  10. JQuery Mobile 页面参数传递

    在单页模版中使用基于HTTP的方式通过POST和GET请求传递参数,而在多页模版中不需要与服务器进行通信,通常在多页模版中有以下三种方法来实现页面间的参数传递. 1.GET方式:在前一个页面生成参数并 ...