Jpa 主键@Id @IdClass 以及 @EmbeddedId和@idClass的区别

2023-10-29

1、自动主键 
默认情况下,主键是一个连续的64位数字(long),它由ObjectDB自动为存储在数据库中的每个新实体对象自动设置。数据库中的第一个实体对象的主键是1,第二个实体对象的主键是2等等。当从数据库中删除实体对象时,主键值不会被回收。 
一个实体的主键值可以通过声明一个主键字段来访问:

@Entity
public class Project {
    @Id @GeneratedValue long id; // still set automatically
}

@id标注将字段标记为一个主键字段。当定义主键字段时,主键值将被ObjectDB自动注入到该字段中。 
@generatedvalue注释指定主键是由ObjectDB自动分配的 
2、应用设置主键 
如果一个实体有一个没有@generatedvalue标记的主键字段,则不会生成自动主键值,并且应用程序负责通过初始化主键字段来设置主键。这必须在持久化实体对象的任何尝试之前完成。

@Entity
public class Project {
    @Id long id; // must be initialized by the application
}

应用程序设置的主键字段可以有以下类型: 
● 原始类型: boolean, byte, short, char, int, long, float, double. 
● java.lang包中的包装类型:Byte, Short, Character, Integer, Long, Float, Double. 
● java.math.BigInteger, java.math.BigDecimal. 
● java.lang.String. 
● java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp. 
● 枚举类型 
● 引用一个实体对象 
3、复合主键 
复合主键由多个主键字段组成。每个主键字段必须是上面列出的支持类型之一。 
例如,以下项目实体类的主键由两个字段组成:

@Entity @IdClass(ProjectId.class)
public class Project {
    @Id int departmentId;
    @Id long projectId;
}

当一个实体有多个主键字段时,JPA需要定义一个特殊的ID类,该类是使用@idclass注释附加到实体类的。ID类反映了主键字段,它的对象可以表示主键值:

Class ProjectId {
    int departmentId;
    long projectId;
}

ObjectDB不强制定义ID类。但是,如果实体对象必须按照检索实体部分中所示的主键来检索实体对象,那么就需要ID类。

转发:https://blog.csdn.net/tracycater/article/details/78319021

================================================================================================

@EmbeddedId和@idClass的区别

@idClass

使复合主键类成为非嵌入类,使用 @IdClass 批注为实体指定一个复合主键类(通常由两个或更多基元类型或 JDK 对象类型组成)。从原有数据库映射时(此时数据库键由多列组成),通常将出现复合主键。

复合主键类具有下列特征:

  • 它是一个普通的旧式 Java 对象 (POJO) 类。

  • 它必须为 public,并且必须有一个 public 无参数构造函数。

  • 如果使用基于属性的访问,则主键类的属性必须为 public 或 protected。

  • 它必须是可序列化的。

  • 它必须定义 equals 和 hashCode 方法。

    这些方法的值相等性的语义必须与键映射到的数据库类型的数据库相等性一致。

  • 它的字段或属性的类型和名称必须与使用 @Id 进行批注的实体主键字段或属性的类型和名称相对应。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package  com.model;
 
import  java.io.Serializable;
 
public  class  SysUserRoleId  implements  Serializable{
     
     /**
      *
      */
     private  static  final  long  serialVersionUID = 2606793267849167078L;
 
     private  Long userId;
     private  Long roleId;
     
     @Override
     public  int  hashCode(){
         int  result =  1 ;
         result = userId.hashCode()+roleId.hashCode();
         return  result;
     }
     
     @Override
     public  boolean  equals(Object obj){
    
         if (obj ==  null ){
             return  false ;
         }
         
         if ( this  == obj){
             return  true ;
         }
         
         if (getClass() != obj.getClass()){
             return  false ;
         }
         
         final  SysUserRoleId other = (SysUserRoleId) obj;
         if (other.getUserId().equals( this .userId) && other.getRoleId().equals( this .roleId)){
             return  true ;
         }
         
         return  false ;
         
     }
     
     public  Long getUserId() {
         return  userId;
     }
     public  void  setUserId(Long userId) {
         this .userId = userId;
     }
     public  Long getRoleId() {
         return  roleId;
     }
     public  void  setRoleId(Long roleId) {
         this .roleId = roleId;
     }  
     
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package  com.model;
 
import  javax.persistence.Column;
import  javax.persistence.Entity;
import  javax.persistence.Id;
import  javax.persistence.IdClass;
import  javax.persistence.Table;
 
 
@Entity
@Table (name= "SYS_USER_ROLE" )
@IdClass (SysUserRoleId. class )
public  class  SysUserRole {
     private  Long userId;
     private  Long roleId;
     
     public  SysUserRole(){
         
     }
     
     public  SysUserRole(Long userId,Long roleId){
         this .userId = userId;
         this .roleId = roleId;
     }
     
     @Id
     @Column (name= "user_id" )
     public  Long getUserId() {
         return  userId;
     }
     public  void  setUserId(Long userId) {
         this .userId = userId;
     }
     
     @Id
     @Column (name= "role_id" )
     public  Long getRoleId() {
         return  roleId;
     }
     public  void  setRoleId(Long roleId) {
         this .roleId = roleId;
     }
     
}

  

 

@EmbeddedId

使复合主键类成为由实体拥有的嵌入类

使用 @EmbeddedId 批注指定一个由实体拥有的可嵌入复合主键类(通常由两个或更多基元类型或 JDK 对象类型组成)。从原有数据库映射时(此时数据库键由多列组成),通常将出现复合主键。

复合主键类具有下列特征:

  • 它是一个普通的旧式 Java 对象 (POJO) 类。

  • 它必须为 public,并且必须有一个 public 无参数构造函数。

  • 如果使用基于属性的访问,则主键类的属性必须为 public 或 protected。

  • 它必须是可序列化的。

  • 它必须定义 equals 和 hashCode 方法。

    这些方法的值相等性的语义必须与键映射到的数据库类型的数据库相等性一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package  com.model;
 
import  java.io.Serializable;
 
import  javax.persistence.Column;
 
@SuppressWarnings ( "serial" )
public  class  SysOrganizationRolePKId  implements  Serializable{
     private  Long organizationId;
     private  Long roleId;
     
     @Column (name= "organization_id" )
     public  Long getOrganizationId() {
         return  organizationId;
     }
     public  void  setOrganizationId(Long organizationId) {
         this .organizationId = organizationId;
     }
     
     @Column (name= "role_id" )
     public  Long getRoleId() {
         return  roleId;
     }
     public  void  setRoleId(Long roleId) {
         this .roleId = roleId;
     }
     
     
}

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package  com.model;
 
import  java.io.Serializable;
 
import  javax.persistence.EmbeddedId;
import  javax.persistence.Entity;
import  javax.persistence.Table;
 
@Entity
@SuppressWarnings ( "serial" )
@Table (name= "SYS_ORGANIZATION_ROLE" )
public  class  SysOrganizationRole  implements  Serializable{
     private  SysOrganizationRolePKId sysOrganizationRolePKId;
 
     @EmbeddedId
     public  SysOrganizationRolePKId getSysOrganizationRolePKId() {
         return  sysOrganizationRolePKId;
     }
 
     public  void  setSysOrganizationRolePKId(
             SysOrganizationRolePKId sysOrganizationRolePKId) {
         this .sysOrganizationRolePKId = sysOrganizationRolePKId;
     }
     
     
}

  作者: lost blog

      出处: http://www.cnblogs.com/JAYIT/

     关于作者:专注服务器端开发


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jpa 主键@Id @IdClass 以及 @EmbeddedId和@idClass的区别 的相关文章

随机推荐

  • 逻辑思维是运用计算机科学的基础概念,简析计算思维中的思维方式及思维本质...

    龙源期刊网 http doc docsou com 简析计算思维中的思维方式及思维本质 作者 张菡 来源 科学与财富 2020年第01期 摘要 计算思维是运用计算机科学的基础概念求解问题 设计系统以及理解人类行为的思维活动 本文主要介绍了计
  • 嵌入式linux应用开发完全手册(一)

    第一篇 嵌入式Linux开发环境构建 1 1 2 嵌入式发展 SCM Single Chip Microcomputer 单片机 MCU Micro Controller Unit 微控制器 SoC System on a Chip 系统级
  • 共享打印机 需要查找inf文件_打印机怎么用图文详解

    大家好 今天分享一篇来自小白系统官网 xiaobaixitong com 的图文教程 打印机在办公场所是非常易见的设备 对于打印机的使用需要也是比较大 但是很多人其实并不晓得打印机怎么用 每次打印的时候都要叫人帮忙 本文就来详细教大家如何解
  • 数据库基础题

    讲一下原来公司里建表的规范有哪些 这些规范有什么好处 事务的几个隔离级别 什么是聚集索引和非聚集索引 数据类型TIMESTAMP和DATETIME有什么不同 一个表有是那个查询字段 年龄 性别 姓名 符合索引怎么建 建的原则是什么 用户表
  • 【读书笔记】高级FPGA设计之面积结构设计

    目录 面积结构设计 折叠流水线 基于控制的逻辑复用 资源共享 复位对面积的影响 无复位的资源 无置位的资源 无同步复位的资源 复位 RAM 利用置位 复位触发器引脚 总结 面积结构设计 本篇讨论数字设计的三个主要物理特性的第二个 面积 并分
  • 【VMware】开启虚拟机时 出现“无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件“,这样完美解决

    今早我打开虚拟机时发现以往从没有出现过打不开的问题 今天竟然出现了 不论我尝试多少次 都是出现 无法打开内核设备 Global vmx86 系统找不到指定的文件 针对这个问题 我尝试了很多方法 以下这种方法是我觉得最好用的方法 Window
  • 别了,Firebug!

    点击上方公众号 可快速关注 转自 技术最前线 TopITNews 如有好文章投稿 请点击 这里了解详情 如果你是前端开发者 那你肯定知道或用过 Firebug 10月24日 Mozilla 工程师和 Firebug 团队领导 Jan Hon
  • “35岁还没副业,都不好意思混职场”:摆脱死工资推荐这种副业

    最近很流行一个词 叫 副业刚需 不管从事什么工作 作为一个成年人都应该要有自己的Plan B 根据某招聘网站发布的研究报告显示 43 9 白领当下有副业刚需 且随年龄增加 对副业的需求程度也在提升 在95后 90后 80后 70后中 有副业
  • drool 7.x 属性:duration

    规则 package com rules import entity Ping declare Ping role event 要把插入的数据声明为event 默认是fact expires 20s 用来显示设置事件的过期时间 也就是说过了
  • Java学习笔记38——网络编程02

    UDP通信程序 UDP通信程序 UDP通信原理 UDP发送程序 UDP接受数据 UDP联系 UDP通信程序 UDP通信原理 UDP协议是一种不可靠的网络协议 它在通信两端各自建立一个Socket对象 但是这两个Socket只是发送 接收数据
  • Java时间格式:yyyy-mm-dd转换为yyyy年mm月dd日

    1 sql直接操作 SELECT DATE FORMAT 2022 01 04 Y年 m月 d日 结果 2022年01月04日 2 java 格式化操作 Date date new SimpleDateFormat yyyy MM dd p
  • HAL库之读写STM32F103内部的FLASH空间

    在此声明 本文摘自这里 码神岛 STM32F0x HAL库学习笔记 5 片内FLASH的读写操作 本文开发环境 MCU型号 STM32F103C8T6 IDE环境 MDK 5 25 代码生成工具 STM32CubeMx 5 0 1 HAL库
  • c语言字符串数组的两种表示方法

    字符串数组 1 定义 字符串数组 一个数组中的所有的元素都是字符串 如果想存储一堆字符串那么可以使用字符串数组 说白了字符串数组就是二维数组 字符串数组两种表示 第一种 char strr 4 6 aaa bbb ccc char类型的二维
  • 设置IntelliJ IDEA的heap size

    error Exception in thread Animation Thread java lang OutOfMemoryError Java heap space 解决方法 run gt edit configurations gt
  • gdb调试-dump

    gdb结合coredump定位崩溃进程 lazycat posted 2012年2月02日 09 35 in linux 18166 阅读 Linux环境下经常遇到某个进程挂掉而找不到原因 我们可以通过生成core file文件加上gdb来
  • Java高并发系统的限流策略

    概要 在大数据量高并发访问时 经常会出现服务或接口面对暴涨的请求而不可用的情况 甚至引发连锁反映导致整个系统崩溃 此时你需要使用的技术手段之一就是限流 当请求达到一定的并发数或速率 就进行等待 排队 降级 拒绝服务等 在开发高并发系统时有三
  • sql javascript ajax,javascript - AJAX Sql Update not working - Stack Overflow

    I stripped down my code to make this question a little simpler This is my PHP at the top of the file if isset POST actio
  • GIS常见数据格式

    文章目录 1 矢量数据格式 2 栅格文件格式 3 模型文件格式 1 矢量数据格式 矢量文件格式 文件说明 数据集类型 AutoCAD Drawing 文件 dwg DWG 是 AutoCAD 的图形文件 专门用于保存矢量图形的标准文件格式
  • 系统环境配置

    JAVA 1 openjdk和Maven安装 添加环境变量 bash profile export MAVEN HOME Users admin Software apache maven 3 8 1 export JAVA HOME Li
  • Jpa 主键@Id @IdClass 以及 @EmbeddedId和@idClass的区别

    1 自动主键 默认情况下 主键是一个连续的64位数字 long 它由ObjectDB自动为存储在数据库中的每个新实体对象自动设置 数据库中的第一个实体对象的主键是1 第二个实体对象的主键是2等等 当从数据库中删除实体对象时 主键值不会被回收