JPA联合主键的使用(@EmbeddedId+@Embeddable)

简介: JPA联合主键的使用(@EmbeddedId+@Embeddable)

在用户角色权限设计中,我们使用复合主键来来保证唯一性


1.数据库


CREATE TABLE `sys_role_detail` (
  `roleid` int(11) DEFAULT NULL COMMENT '角色id',
  `menuid` int(11) DEFAULT NULL COMMENT '菜单id',
  `orgcode` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


2.实体类的联合主键


联合主键满足条件:

 

必须实现Serializable

必须有默认的 public无参数的构造方法、必须覆盖 equals和 hashCode 方法,这些要求与使用复合主键的要求相同

将嵌入式主键类使用 @Embeddable 标注,表示这个是一个嵌入式类。

package com.datalook.model;
import javax.persistence.Column;
import javax.persistence.Embeddable;
/**
 * SysRoleDetailId entity. 
 */
@SuppressWarnings("serial")
@Embeddable
public class SysRoleDetailId implements java.io.Serializable {
  // Fields
  private Integer roleid;
  private Integer menuid;
  // Constructors
  /** default constructor */
  public SysRoleDetailId() {
  }
  /** full constructor */
  public SysRoleDetailId(Integer roleid, Integer menuid) {
    this.roleid = roleid;
    this.menuid = menuid;
  }
  // Property accessors
  @Column(name = "roleid")
  public Integer getRoleid() {
    return this.roleid;
  }
  public void setRoleid(Integer roleid) {
    this.roleid = roleid;
  }
  @Column(name = "menuid")
  public Integer getMenuid() {
    return this.menuid;
  }
  public void setMenuid(Integer menuid) {
    this.menuid = menuid;
  }
  public boolean equals(Object other) {
    if ((this == other))
      return true;
    if ((other == null))
      return false;
    if (!(other instanceof SysRoleDetailId))
      return false;
    SysRoleDetailId castOther = (SysRoleDetailId) other;
    return ((this.getRoleid() == castOther.getRoleid()) || (this
        .getRoleid() != null
        && castOther.getRoleid() != null && this.getRoleid().equals(
        castOther.getRoleid())))
        && ((this.getMenuid() == castOther.getMenuid()) || (this
            .getMenuid() != null
            && castOther.getMenuid() != null && this.getMenuid()
            .equals(castOther.getMenuid())));
  }
  public int hashCode() {
    int result = 17;
    result = 37 * result
        + (getRoleid() == null ? 0 : this.getRoleid().hashCode());
    result = 37 * result
        + (getMenuid() == null ? 0 : this.getMenuid().hashCode());
    return result;
  }
  @Override
  public String toString() {
    return "SysRoleDetailId [roleid=" + roleid + ", menuid=" + menuid + "]";
  }
}


3.实体

@EmbeddedId和@AttributeOverrides 属性映射

package com.datalook.model;
import java.sql.Timestamp;
import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import com.newcapec.model.AbstractDataLookModel;
/**
 * SysRoleDetail entity. @author MyEclipse Persistence Tools
 */
@Entity
@Table(name = "sys_role_detail")
public class SysRoleDetail extends AbstractDataLookModel {
    // Constructors
  /** default constructor */
  public SysRoleDetail() {
  }
  /** constructor */
  public SysRoleDetail(SysRoleDetailId sysRoleDetailId) {
    this.sysRoleDetailId = sysRoleDetailId;
  }
  private static final long serialVersionUID = -4244160679944459020L;
  private SysRoleDetailId sysRoleDetailId;
  private String orgcode;
  // Property accessors
  @Column(name = "orgcode", length = 32)
  public String getOrgcode() {
    return this.orgcode;
  }
  public void setOrgcode(String orgcode) {
    this.orgcode = orgcode;
  }
  @EmbeddedId
  @AttributeOverrides( {
      @AttributeOverride(name = "roleid", column = @Column(name = "roleid")),
      @AttributeOverride(name = "menuid", column = @Column(name = "menuid")) })
  public SysRoleDetailId getSysRoleDetailId() {
    return this.sysRoleDetailId;
  }
  public void setSysRoleDetailId(SysRoleDetailId sysRoleDetailId) {
    this.sysRoleDetailId = sysRoleDetailId;
  }
  @Override
  public String toString() {
    return "SysRoleDetail [sysRoleDetailId=" + sysRoleDetailId + ", orgcode=" + orgcode + "]";
  }
}

 


目录
相关文章
|
7月前
主键自增
主键自增。
42 4
|
安全 数据库
通过E-R理解 主键和外键的关系
实例 现有课程和教师两个实体,课程实体的属性有课程名称、课程编号、课程属性、考试类型;教师实体的属性包括姓名、工号、职称;一门课程可以有多个教师,且每一位教师可以教授多门课程。教师每教授一门课有课序号。
5057 1
通过E-R理解 主键和外键的关系
|
SQL 关系型数据库 MySQL
列的完整性约束——主键约束
列的完整性约束——主键约束
|
关系型数据库 MySQL
MySQL查询之 如何删除主键和添加主键等修饰词
MySQL查询之 如何删除主键和添加主键等修饰词
147 0
|
存储 关系型数据库 MySQL
主键与外键
主键与外键
303 0
|
SQL 关系型数据库 MySQL
列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)
列的完整性约束——设置表字段的外键约束(FOREIGN KEY,FK)
基于Saas主键表生成主键id
首先需要对当前的id进行拦截操作,也即使用aop的切面Aspect对切点进行拦截,在进行新增的时候进行拦截: 也就是说在进行主键的生成时,我们拦截好需要生成的主键,此时就可以对其进行新增操作了,而首要的就是拿到它的primaryKey。由于进行新增操作,通常分为两种情况: 通过字节码拿到声明的方法getId,如果此时存在id,则说明此时的操作是更新操作,因此直接返回。如果当前通过字节码拿到的声明方法getTenant,通过租户方法拿到租户id。拿到租户id后,就可以进行主键id获取了。
179 0
基于Saas主键表生成主键id
|
SQL 开发者
主键自增长|学习笔记
快速学习主键自增长
|
SQL 架构师 关系型数据库
自增主键,很多人以为自己懂了,然而...
关于InnoDB下,自增键机制的四个实验。
422 0