使用@Id时主键生成策略:TABLE、SEQUENCE、IDENTITY、AUTO

2023-11-13

主键生成策略:GenerationType.TABLE、GenerationType.SEQUENCE、GenerationType.IDENTITY、GenerationType.AUTO

TABLE:
使用一个特定的数据库表格来保存主键,持久化引擎通过关系数据库的一张特定的表格来生成主键,这种策略的好处就是不依赖于外部环境和数据库的具体实现,在不同数据库间可以很容易的进行移植,但由于其不能充分利用数据库的特性,所以不会优先使用。该策略一般与另外一个注解@TableGenerator一起使用【指定了生成主键的表(可以在class类上指定也可以在 Id 上指定)】,然后JPA将会根据注解内容自动生成一张表作为序列表(或使用现有的序列表)。如果不指定序列表,则会生成一张默认的序列表,表中的列名也是自动生成,数据库上会生成一张名为sequence的表(SEQ_NAME,SEQ_COUNT)。序列表一般只包含两个字段:第一个字段是该生成策略的名称,第二个字段是该关系表的最大序号,它会随着数据的插入逐渐累加。
例如:

@Id
@GeneratedValue(strategy=GenereationType.TABLE,generator="table_gen")
@TableGenerator(name="table_gen",table="fendo_generator",pkColumnName="seq_name",pkColumnValue="fendos",valueColumnName="seq_id",initialValue=1,allocationSize=1)

解释:
//name对应@GeneratedValue中generator的值。
//table对应序列的数据表名
//pkColumnName是数据表中主键对应序列表中的列名。
//pkColumnValue是数据表中主键对应序列表中的列名的值。
//valueColumnName是主键当前值,每次累加
//initialValue是初始值
//allocationSize是每次主键的累加值

SEQUENCE
根据底层数据库的序列来生成主键,条件是数据库支持序列(Oracle,DB2,Mysql不支持序列,所以不能使用)。
例如:

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="fendo_seq")
@SequenceGenerator(name="fendo_seq",sequenceName="seq_name")

解释:
//name:name属性: 表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
//sequenceName:标识生成策略用到的数据库序列名称。
//initialValue:主键初始值。(默认0)
//allocationSize:主键每次累加值。(默认50)

IDENTITY:主键由数据库自动生成(主要是自动增长型,常用于Mysql数据库)
例如:

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)

解释 :
strategy = GenerationType.IDENTITY:自增长主键生成策略。

AUTO: 主键由程序控制。
把主键生成策略交给持久化引擎(persistence engine),持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种。常用,JPA默认的生成策略就是GenerationType.AUTO,可显示指定为
@GeneratedValue(strategy = GenerationType.AUTO),或直接省略不写@GeneratedValue

@GenericGenerator注解----自定义主键生成策略
一般配合@GeneratorValue使用:

@GeneratedValue(generator = "paymentableGenerator")    
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned") 

解释:
name属性指定生成器名称。
strategy属性指定具体生成器的类名。

strategy 参数如下:

static {  
 
  GENERATORS.put("uuid", UUIDHexGenerator.class); 
 
  GENERATORS.put("hilo", TableHiLoGenerator.class); 
 
  GENERATORS.put("assigned", Assigned.class); 
 
  GENERATORS.put("identity", IdentityGenerator.class); 
 
  GENERATORS.put("select", SelectGenerator.class); 
 
  GENERATORS.put("sequence", SequenceGenerator.class); 
 
  GENERATORS.put("seqhilo", SequenceHiLoGenerator.class); 
 
  GENERATORS.put("increment", IncrementGenerator.class); 
 
  GENERATORS.put("foreign", ForeignGenerator.class); 
 
  GENERATORS.put("guid", GUIDGenerator.class); 
 
  GENERATORS.put("uuid.hex", UUIDHexGenerator.class);//uuid.hex is deprecated  
 
  GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class); 
 
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用@Id时主键生成策略:TABLE、SEQUENCE、IDENTITY、AUTO 的相关文章

  • R - hist3D 序列颜色和标签问题

    所以我有一个 5 行 20 列的数据集 我正在尝试绘制一个hist3D来自plot3D包裹 dt structure c 1 1 1 3 1 2 1 0 2 1 2 1 0 1 1 0 1 0 2 2 1 1 1 1 4 4 1 1 2 3
  • Python:检查对象是否是序列

    在 python 中 有没有一种简单的方法来判断某些东西是否不是序列 我尝试这样做 if x is not sequence但Python不喜欢那样 iter x 将提出一个TypeError if x不能迭代 但该检查 接受 集合和字典
  • SQL Server,如何设置建表后自增而不丢失数据?

    我有一张桌子table1在 SQL Server 2008 中 它有记录 我想要主键table1 Sno列是自动递增列 可以在不进行任何数据传输或表克隆的情况下完成此操作吗 我知道我可以使用 ALTER TABLE 添加自动增量列 但是我可
  • R - 从排序数据构建新变量

    这是更新 后续this https stackoverflow com questions 55639062 detecting sequence by group and compute new variable for the subs
  • 基于 R 中的分组变量创建序列[重复]

    这个问题在这里已经有答案了 我正在寻找一种方法来创建一个数字序列 C 每次字符串在 A 中发生变化时该序列都会升序 这取决于分组变量 B 例子 A B C a1 1 1 a1 1 1 a1 1 1 a10 1 2 a10 1 2 a2 1
  • 在 DB2 中将序列递增两次

    我需要在 DB2 版本 9 1 中两次获取序列的下一个值 而不是执行以下两次 SELECT nextval FOR schema sequence AS id FROM dual 我想做这样的事情 SELECT nextval FOR sc
  • 创建以字母数字开头的 Oracle 序列

    我想创建以字符开头的序列inv并增加 1 的价值观 INV01 INV02 INV03 etc CREATE SEQUENCE invoice nun START WITH INV INCREMENT BY 1 只能创建整数值序列 所以声明
  • WSO2 身份服务器 - Oauth 2.0 - Java 签核示例

    我为 Oauth2 身份验证流程编写了一个基于 Java 的签核例程 令牌撤销 请参阅下面的代码实现 遵循手册中描述的 cURL 协议说明 here https docs wso2 com display IS500 OAuth Token
  • 截断表后序列不会重置

    我在截断表后使用 SELECT lastval 来获取错误的序列号 当我截断表时 我使用 SELECT lastval 我得到了错误的 ID Use the TRUNCATESQL 命令 对于单个表 语法如下 TRUNCATE TABLE
  • 使用 lambda 或 Stream API 合并流以生成交替序列

    我有一些按预期返回 Stream 的代码 但也许可以用某种类型的 lambda 或 stream 操作替换它 而不是耗尽 a 中的迭代器while loop 它只是一种交替流中元素的方法first and second当其中一个元素耗尽时停
  • Clojure 集合与序列的相等性

    我注意到 Clojure 1 4 似乎很乐意考虑向量等于seq相同的向量 但同样不适用于地图 1 2 seq 1 2 gt true 1 2 seq 1 2 gt false 为什么要这样的行为 这样会有所不同吗 Clojure 的 可以认
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • python是带有字符串的运算符行为[重复]

    这个问题在这里已经有答案了 我无法理解以下行为 我正在创建 2 个字符串 并使用 is 运算符来比较它 对于第一种情况 它的工作方式有所不同 对于第二种情况 它按预期工作 当我使用逗号或空格时 它显示是什么原因False与比较is当没有使用
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID
  • SecItemAdd 创建两个身份

    我正在为 iPhone 开发一个应用程序 需要证书来调用某些服务 因此我将证书添加到我的钥匙串中 执行以下操作 SecCertificateRef cert SecCertificateCreateWithData NULL bridge
  • 如何在 Scala mutable.Seq 上追加或前置

    Scala 有一些我不明白的地方collection mutable Seq http www scala lang org api current index html scala collection mutable Seq 它描述了所
  • 查找“未找到身份”的角色分配的可靠方法是什么?在 Azure 上使用 Powershell?

    如果您在 Azure 中分配角色 然后在删除角色分配之前删除该身份 则会出现 找不到身份 的情况 健康 状况 它是无害的 但它会占用角色分配空位并使角色分配列表变得混乱 我想找到并删除这些 我想这个 Get AzRoleAssignment
  • c++11 中指针的“auto”类型赋值是否需要“*”?

    鉴于我的变量是指针 如果我将其分配给 auto 类型的变量 我是否指定 std vector
  • 用户注销速度非常快

    我正在使用 ASP NET 身份成员身份 这是 Startup Auth cs 代码 app CreatePerOwinContext EFDbContext Create app CreatePerOwinContext
  • 函数输入参数的 auto 是否可以替代函数模板?

    在 C 20 中auto关键字可用于函数输入参数 这是函数模板的适当替代吗 在决定采用哪种方法时是否需要考虑任何实际差异 template

随机推荐

  • 多目录时Makefile 的编写方法

    多级目录结构的Makefile 本文主要以例程的方式展示了二级目录结构下的Makefile的写法 详细注释 对于更加纷杂的多级目录 大家可在此基础上进行修改 定义变量 ARCH默认为x86 使用gcc编译器 否则使用arm编译器 ARCH
  • 学机器人就是编程吗

    学机器人就是编程吗 小孩的学习从古至今都是家长们十分关心和重视的一件事情 很多家长在培养孩子的学习方面也是非常的用心的 会给孩子选择一些能够有利于孩子成长的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于学机器人就是
  • Python 3 – 文件 readline() 方法

    Python 3 文件 readline 方法 极客笔记 打开文件 file open example txt r 读取文件中的一行数据 line file readline while line 移除行尾的换行符 print line s
  • Linux——lseek函数、stat函数、lstat和stat、linux和Unix隐式回收、目录操作函数

    一 lseek函数 获取文件大小示例 扩展文件大小示例 但是如果要真改变文件大小必须有I O读写操作 无I O示例的扩展 结果 原来大小是777 扩展111 lseek是888 但是文件大小还是777 加上I O操作 即加个write 最重
  • 看看Ubuntu22.10的几个新功能值不值得更新和升级

    目录 前言 桌面可用性和性能提升 优化的开发者工作流 支持微控制器和嵌入式显示器 升级企业管理工具 前言 2022年10月20日 Ubuntu开发商Canonical宣布正式推出Ubuntu 22 10 代号 Kinetic Kudu Ca
  • html弹窗代码只弹窗一次,js 弹出框只弹一次(二次修改后)

    弹出框只弹一次 edit www jquerycn cn var returnvalue function openpopup colorbox inline true href getGiftForm innerWidth 650px i
  • raid读写速度对比_深入分析各种raid级别相对单盘速度变化

    入分析各种raid级别相对单盘速度变化 RAID0用分片存储方式把数据分布在两个盘或更多盘上 读写持续传输速率会增加一倍 随机读写速度按理论是有可能增加的 这取决于数据分片大小和读写的大小 不过总的来说很值得怀疑 硬件RAID1的随机和持续
  • 3D茶壶绘制_2021秋季《计算机图形学》_基于《计算机图形学(第四版)》D.H.&M.P.B.&W.R.C.

    一 实验目的 绘制3D茶壶 形状为传统的紫砂茶壶 用光照模型着色 用键盘实现旋转 二 实验环境 Visual Studio 2019 Windows 10 三 算法分析与设计 四 实验结果 旋转 五 附录 include
  • pycharm之pip

    不知道朋友们用过maven没有 使用JAVA编程的人应该有人用过这个有趣的东西 JAVA导包是容易的 然而 懒是没有极限了 所以maven出来了 一个丰满的开发包仓库 不需要你再去哪儿找找找 但是这又算得了什么 我们伟大的Python怎么可
  • Android网络开源库-Retrofit(二) 文件上传、下载及进度监听

    1 写在前面的话 首先说明 我还没太搞懂retrofit 目前 这篇博客只能给出这几个内容 文件上传 文件下载 文件下载的进度监听 还有这两点没弄好 多文件一次上传 批量上传 文件上传进度监听 当前使用版本 compile com squa
  • 使用element UI的日期选择器,默认显示当天日期及7天前日期

    方法一 采用选择器 type datetimerange 默认获取内容为时间戳
  • 毕业设计-基于机器视觉的路面裂缝检测装置-OpenCV

    目录 前言 课题背景和意义 实现技术思路 一 系统架构及工作原理 二 图像传输和处置 三 裂缝检测 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力
  • oracle驱动重启吗,Troubleshooting for oracle

    本文总结与归纳了平常遇到的一些关于Oracle 18c的错误以及处理方法 会不定期的进行更新 1 dbca Fails With PRCR 1006 PRCR 1071 CRS 2566 这里的asm环境使用了Oracle ASM Filt
  • BGP基础实验(4)联邦划分

    目录 前言 一 实验拓扑图 二 实验目的 三 实验配置 1 路由器声明BGP进程 2 普通EBGP邻居建立 3 联邦IBGP邻居建立 4 联邦EBGP邻居建立 四 实验观测 五 实验总结 前言 网盘资源 BGP基础实验 联邦划分 zip 蓝
  • Linux01-虚拟机安装(VMware15+CentOS7)

    一 虚拟机介绍 虚拟机 Virtual Machine 指通过软件模拟的具有完整硬件系统功能的 运行在一个完全隔离环境中的完整计算机系统 在实体计算机中能够完成的工作在虚拟机中都能够实现 在计算机中创建虚拟机时 需要将实体机的部分硬盘和内存
  • 使用百度AI开放平台进行车牌识别

    文章目录 百度AI开放平台车牌识别使用 1 产生token 2 车牌识别 3 解析结果 参考 本文介绍了如何使用百度AI开放平台获取token 以及如何调用百度API接口 请求车牌识别 以及对结果进行解析 并根据百度返回的坐标值画出车牌所在
  • 使用Jasmine在Angular中测试组件:第1部分

    您将要创造的 测试驱动开发是一种编程实践 已由地球上每个开发人员社区宣讲和推广 但这是开发人员在学习新框架时经常忽略的例程 从第一天开始编写单元测试 将帮助您编写更好的代码 轻松发现错误并维护更好的开发工作流程 Angular中的测试驱动开
  • 六级单词词汇表(有注音)

    英语六级备考词汇表 abnormal b n m l a 不正常的 变态的 abolish b li vt 废除 取消 abrupt br pt a 突然的 意外的 唐突的 absurd b s d a 不合理的 荒唐的 abundance
  • python-16进制字符串和16进制数字转换

    0xa1 0x09 0x1c 0xef gt a1 09 1c ef b xa1 x09 x1c xef hex a1091cef a1 09 1c ef gt 0xa1 0x09 0x1c 0xef bytes fromhex a1091
  • 使用@Id时主键生成策略:TABLE、SEQUENCE、IDENTITY、AUTO

    主键生成策略 GenerationType TABLE GenerationType SEQUENCE GenerationType IDENTITY GenerationType AUTO TABLE 使用一个特定的数据库表格来保存主键