Spring Data Jpa 复合主键
这次有个需求,在数据库建表时发现,主键为复合主键:
这里采用@IdClass注解的方式来实现复合主键;
思路
编写一个复合主键类UserProjectMultiKeysClass;
通过@IdClass注释在实体中标注复合主键;
可以通过EntityManager获取数据,或者是直接在Repository 里写方法;
package com.hiocs.cron.entity;import java.io.Serializable;/*** @ Author :johnbarrowman65* @ Date :Created in 16:32 2019/4/8* @ Description:EnteredInfo 联合主键*/
public class UserProjectMultiKeysClass implements Serializable {private static final long serialVersionUID = 1L;private String bmbbm;// private String xh;// private String xxdm;// public UserProjectMultiKeysClass() {}public UserProjectMultiKeysClass(String bmbbm, String xh, String xxdm) {this.bmbbm = bmbbm;this.xh = xh;this.xxdm = xxdm;}public String getBmbbm() {return bmbbm;}public void setBmbbm(String bmbbm) {this.bmbbm = bmbbm;}public String getXh() {return xh;}public void setXh(String xh) {this.xh = xh;}public String getXxdm() {return xxdm;}public void setXxdm(String xxdm) {this.xxdm = xxdm;}// ***重写hashCode与equals方法***@Overridepublic int hashCode() {final int PRIME = 31;int result = 1;result = PRIME * result + ((bmbbm == null) ? 0 : bmbbm.hashCode());result = PRIME * result + ((xh == null) ? 0 : xh.hashCode());result = PRIME * result + ((xxdm == null) ? 0 : xxdm.hashCode());return result;}@Overridepublic boolean equals(Object obj){if(this == obj){return true;}if(obj == null){return false;}if(getClass() != obj.getClass()){return false;}final UserProjectMultiKeysClass other = (UserProjectMultiKeysClass)obj;if(bmbbm == null){if(other.bmbbm != null){return false;}}else if(!bmbbm.equals(other.bmbbm)){return false;}if(xh == null){if(other.xh != null){return false;}}else if(!xh.equals(other.xh)){return false;}if(xxdm == null){if(other.xxdm != null){return false;}}else if(!xxdm.equals(other.xxdm)){return false;}return true;}
}
注意:
复合主键类必须满足:
1. 实现Serializable接口;
2. 有默认的public无参数的构造方法;
3. 重写equals和hashCode方法。equals方法用于判断两个对象是否相同,EntityManger通过find方法来查找Entity时,是根据equals的返回值来判断的。hashCode方法返回当前对象的哈希码;
实体类
package com.hiocs.cron.entity;import javax.persistence.*;
import java.io.Serializable;/*** 报名信息实体类* @author*/
@Entity
@Table(name = "XX_ENTERED_INFO")
@IdClass(UserProjectMultiKeysClass.class)
public class EnteredInfo implements Serializable {private static final long serialVersionUID = 1L;private String bmbbm;// private String xh;// private String gbzydm;// private String batch_number;private String xxdm;// private String xm;// private int xb_id;// private int mzdm_id;// private int zzmm_id;// private String jg;//private int zjlxId; //private String spzh;// private String spdz;// private String dwmc;private String dwdz;private String dwsszj;private String education;private String lxdz_city;private String lxdz_town;private String lxdz;// private String lxrxm;// private String lxrgx;// private String lxrdh;// private String mobile;private Boolean sfcyjnzs;private int ly_id;// private Long bmsj;// private int state_id;// private String updated;private String memo;// private int sfebss;//private int sfsfzhf;//private String sfzf;//@Overridepublic String toString() {return "EnteredInfo{" +"bmbbm='" + bmbbm + '\'' +", xh='" + xh + '\'' +", gbzydm='" + gbzydm + '\'' +", batch_number='" + batch_number + '\'' +", xxdm='" + xxdm + '\'' +", xm='" + xm + '\'' +", xb_id=" + xb_id +", mzdm_id=" + mzdm_id +", zzmm_id=" + zzmm_id +", jg='" + jg + '\'' +", zjlxId=" + zjlxId +", spzh='" + spzh + '\'' +", spdz='" + spdz + '\'' +", dwmc='" + dwmc + '\'' +", dwdz='" + dwdz + '\'' +", dwsszj='" + dwsszj + '\'' +", education='" + education + '\'' +", lxdz_city='" + lxdz_city + '\'' +", lxdz_town='" + lxdz_town + '\'' +", lxdz='" + lxdz + '\'' +", lxrxm='" + lxrxm + '\'' +", lxrgx='" + lxrgx + '\'' +", lxrdh='" + lxrdh + '\'' +", mobile='" + mobile + '\'' +", sfcyjnzs=" + sfcyjnzs +", ly_id=" + ly_id +", bmsj=" + bmsj +", state_id=" + state_id +", updated='" + updated + '\'' +", memo='" + memo + '\'' +", sfebss=" + sfebss +", sfsfzhf=" + sfsfzhf +", sfzf='" + sfzf + '\'' +'}';}public String getUpdated() {return updated;}public void setUpdated(String updated) {this.updated = updated;}public String getSfzf() {return sfzf;}public void setSfzf(String sfzf) {this.sfzf = sfzf;}public int getSfebss() {return sfebss;}public void setSfebss(int sfebss) {this.sfebss = sfebss;}public int getSfsfzhf() {return sfsfzhf;}public void setSfsfzhf(int sfsfzhf) {this.sfsfzhf = sfsfzhf;}@Idpublic String getBmbbm() {return bmbbm;}public void setBmbbm(String bmbbm) {this.bmbbm = bmbbm;}@Idpublic String getXh() {return xh;}public void setXh(String xh) {this.xh = xh;}public String getGbzydm() {return gbzydm;}public void setGbzydm(String gbzydm) {this.gbzydm = gbzydm;}public static long getSerialVersionUID() {return serialVersionUID;}public String getBatch_number() {return batch_number;}public void setBatch_number(String batch_number) {this.batch_number = batch_number;}@Idpublic String getXxdm() {return xxdm;}public void setXxdm(String xxdm) {this.xxdm = xxdm;}public String getXm() {return xm;}public void setXm(String xm) {this.xm = xm;}public int getXb_id() {return xb_id;}public void setXb_id(int xb_id) {this.xb_id = xb_id;}public int getMzdm_id() {return mzdm_id;}public void setMzdm_id(int mzdm_id) {this.mzdm_id = mzdm_id;}public int getZzmm_id() {return zzmm_id;}public void setZzmm_id(int zzmm_id) {this.zzmm_id = zzmm_id;}public String getJg() {return jg;}public void setJg(String jg) {this.jg = jg;}public int getZjlxId() {return zjlxId;}public void setZjlxId(int zjlxId) {this.zjlxId = zjlxId;}public String getSpzh() {return spzh;}public void setSpzh(String spzh) {this.spzh = spzh;}public String getSpdz() {return spdz;}public void setSpdz(String spdz) {this.spdz = spdz;}public String getDwmc() {return dwmc;}public void setDwmc(String dwmc) {this.dwmc = dwmc;}public String getDwdz() {return dwdz;}public void setDwdz(String dwdz) {this.dwdz = dwdz;}public String getDwsszj() {return dwsszj;}public void setDwsszj(String dwsszj) {this.dwsszj = dwsszj;}public String getEducation() {return education;}public void setEducation(String education) {this.education = education;}public String getLxdz_city() {return lxdz_city;}public void setLxdz_city(String lxdz_city) {this.lxdz_city = lxdz_city;}public String getLxdz_town() {return lxdz_town;}public void setLxdz_town(String lxdz_town) {this.lxdz_town = lxdz_town;}public String getLxdz() {return lxdz;}public void setLxdz(String lxdz) {this.lxdz = lxdz;}public String getLxrxm() {return lxrxm;}public void setLxrxm(String lxrxm) {this.lxrxm = lxrxm;}public String getLxrgx() {return lxrgx;}public void setLxrgx(String lxrgx) {this.lxrgx = lxrgx;}public String getLxrdh() {return lxrdh;}public void setLxrdh(String lxrdh) {this.lxrdh = lxrdh;}public String getMobile() {return mobile;}public void setMobile(String mobile) {this.mobile = mobile;}public Boolean getSfcyjnzs() {return sfcyjnzs;}public void setSfcyjnzs(Boolean sfcyjnzs) {this.sfcyjnzs = sfcyjnzs;}public int getLy_id() {return ly_id;}public void setLy_id(int ly_id) {this.ly_id = ly_id;}public Long getBmsj() {return bmsj;}public void setBmsj(Long bmsj) {this.bmsj = bmsj;}public int getState_id() {return state_id;}public void setState_id(int state_id) {this.state_id = state_id;}public String getMemo() {return memo;}public void setMemo(String memo) {this.memo = memo;}
}
注意:
1. @IdClass标注用于标注实体所使用主键规则的类;
2. 在实体中同时标注主键的属性,比如这段代码中的userId
,projectId
以及timestamp
;
Spring Data Jpa 复合主键相关推荐
- java 复合主键,Spring Data Jpa 复合主键的实现
前言 这次大创有个需求,在数据库建表时发现,user表与project表的关系表 user_project的主键为复合主键: CREATE TABLE user_project( user_id IN ...
- SpringData JPA复合主键
一.JPA和复合主键的简介 JPA全称Java Persistence API,是一组用于将数据存入数据库的类和方法的集合.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系, ...
- springboot jpa 复合主键 联合主键
为什么80%的码农都做不了架构师?>>> 在开发中,数据库中定义了一个复合主键,这时候在映射不稍微处理下会有一点问题.什么does not define an IdClass错 ...
- JPA复合主键的使用
背景 人员信息和组信息的关联表中使用的USER_ID_和GROUP_ID_的联合主键,在维护组人员信息的时候,发现JPA打印的SQL只根据USER_ID_作为条件来更新数据,当B组存在zhangsan ...
- 使用Spring Data JPA进行分页和排序
通过代码示例学习使用Spring Data JPA进行分页和排序 . 了解如何使用Springs PagingAndSortingRepository接口获取分页和排序结果. 1概述 在处理大量数据时 ...
- JPA之使用复合主键
文章目录 1. 目标 2. 数据库设计 3. Entity 定义 4. 使用 5. 源码 1. 目标 在设计数据库表的时候,有时候不想定义没有意义的Id作为主键,就可以使用复合主键.这个时候使用JPA ...
- Spring Boot 、Spring Data JPA、Hibernate集成
###什么是JPA JPA是用于管理Java EE 和Java SE环境中的持久化,以及对象/关系映射的JAVA API 最新规范为"JSR 338:Java Persistence 2.1 ...
- Spring Data JPA 之 @Entity 的常用注解
6 Spring Data JPA 之 @Entity 的常用注解 前⼏课时介绍了 Repository 的⽤法,其中经常会提到"实体类"(即前⾯的User 类),它是对我们数据库 ...
- 【SpringBoot框架篇】11.Spring Data Jpa实战
文章目录 1.简介 1.1.JPA 1.2.Spring Data Jpa 1.3.Hibernate 1.4.Jpa.Spring Data Jpa.Hibernate三者之间的关系 2.引入依赖 ...
- Spring Boot整合Spring Data JPA操作数据
一. Sping Data JPA 简介 Spring Data JPA 是 Spring 基于 ORM 框架.JPA 规范的基础上封装的一套 JPA 应用框架,底层使用了 Hibernate 的 J ...
最新文章
- Django框架搭建
- 【机器学习】数据挖掘算法——关联规则(一),相关概念,评价指标
- java 方法委托托管_Java Web托管选项流程图
- sp | sp格式的空间矢量对象及其函数方法简介
- 强悍的 vim —— g s 替换区别
- Android Studio解决:Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed
- [置顶] javascript中的数组对象以及json学习笔记
- 在线音乐网站网站开发项目 ,第一篇
- 数据通信技术初级工程师证题库
- 主机炸鸡?Z世代主机市场终究是肯德基的?
- 8.6 百度首页编写-导航栏
- 计算机课拔线头检讨书,乱接电线检讨书
- 【postgres】源码结构
- 如何进行有效的计划管理?
- 比较正确的 iPhone7/7+ 的进入DFU的方法是这样的
- 4 看电影--贪心算法
- Python|判断字符串是否符合日期要求
- 并发编程-25 高并发处理手段之消息队列思路 + 应用拆分思路 + 应用限流思路
- python中的格式化输出
- 梅科尔工作室—罗森——鸿蒙笔记2