当前位置: 首页 > 编程日记 > 正文

JPA主键生成策略

@GeneratedValue

为一个实体类生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键)。它有两个属性,分别是strategy和generator。

generator:默认为空字符串,它定义了主键生成器的名称,对应的生成器有两个:对应于同名的主键生成器@SequenceGenerator和@TableGenerator。

strategy:一共有四种,被定义在枚举类GenerationType中,包括:TABLE, SEQUENCE, IDENTITY 和AUTO。

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

1 @Id  
2 @GeneratedValue(strategy = GenerationType.TABLE, generator = "id_sequence")  
3 @TableGenerator(name = "id_sequence", allocationSize = 1, table = "sequence_table", pkColumnName = "sequence_max_id", valueColumnName = "sequence_count")  
4 private int id;

2.GenerationType.SEQUENCE:在某些数据库中,不支持主键自增长,比如Oracle,其提供了一种叫做"序列(sequence)"的机制生成主键。此时,GenerationType.SEQUENCE就可以作为主键生成策略。该策略的不足之处正好与TABLE相反,由于只有部分数据库(Oracle,PostgreSQL,DB2)支持序列对象,所以该策略一般不应用于其他数据库。类似的,该策略一般与另外一个注解一起使用@SequenceGenerator,@SequenceGenerator注解指定了生成主键的序列.然后JPA会根据注解内容创建一个序列(或使用一个现有的序列)。如果不指定序列,则会自动生成一个序列SEQ_GEN_SEQUENCE。例如:

1 @Id  
2 @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_sequence")  
3 @SequenceGenerator(name = "id_sequence", initialValue = 1, allocationSize = 1, sequenceName = "ID_SEQUENCE")  
4 private int id;

3.GenerationType.IDENTITY:此种主键生成策略就是通常所说的主键自增长,数据库在插入数据时,会自动给主键赋值,比如MYSQL可以在创建表时声明"auto_increment" 来指定主键自增长。该策略在大部分数据库中都提供了支持(指定方法或关键字可能不同),但还是有少数数据库不支持,所以可移植性略差。使用自增长主键生成策略是只需要声明strategy = GenerationType.IDENTITY即可。例如:

1 @Id  
2 @GeneratedValue(strategy = GenerationType.IDENTITY)  
3 private int id;

4.GenerationType.AUTO:把主键生成策略交给持久化引擎(persistence engine),持久化引擎会根据数据库在以上三种主键生成策略中选择其中一种。此种主键生成策略比较常用,由于JPA默认的生成策略就是GenerationType.AUTO,所以使用此种策略时.可以显式的指定@GeneratedValue(strategy = GenerationType.AUTO)也可以直接@GeneratedValue。例如:

@GeneratedValue(strategy = GenerationType.AUTO)  
private int id;

@GenericGenerator:

是HIbernate提供的自定义主键策略生成器,它需要和@GeneratedValue一起使用,并且它的name属性要和@GeneratedValue中的generator名称要一致。

@GenericGenerator支持13种策略,分别是:

 1 static {  
 2 
 3   GENERATORS.put("uuid", UUIDHexGenerator.class);  
 4 
 5   GENERATORS.put("hilo", TableHiLoGenerator.class);  
 6 
 7   GENERATORS.put("assigned", Assigned.class);  
 8 
 9   GENERATORS.put("identity", IdentityGenerator.class);  
10 
11   GENERATORS.put("select", SelectGenerator.class);  
12 
13   GENERATORS.put("sequence", SequenceGenerator.class);  
14 
15   GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);  
16 
17   GENERATORS.put("increment", IncrementGenerator.class);  
18 
19   GENERATORS.put("foreign", ForeignGenerator.class);  
20 
21   GENERATORS.put("guid", GUIDGenerator.class);  
22 
23   GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated  
24 
25   GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);  
26 
27 }

上面的12种策略,再加上native,一共是13种。其实,这就是hibernate对JPA策略的一种拓展补充。举个例子:

1 @GeneratedValue(generator = "paymentableGenerator") 
2 @GenericGenerator(name = "paymentableGenerator", strategy = "uuid")
3 private int id;

它会根据内部程序计算出32位长度的唯一id。

参考:

http://blog.csdn.net/u012493207/article/details/50846616

http://blog.csdn.net/tianxiezuomaikong/article/details/64930151

转载于:https://www.cnblogs.com/SummerinShire/p/7544897.html

相关文章:

Silverlight 预定义颜色速查表

预定义颜色可以使用 SolidColorBrush 绘制,它使用预定义纯色。这可以是 Colors 的静态属性 (Property) 名称,也可以是指定为 XAML 属性 (Attribute) 值时直接作为字符串处理的另外一组颜色名称中的一个。有关已命名颜色表以及如何在代码中指定已命名颜色…

腾讯云TDSQL-A发布公有云版本 支持第七次全国人口普查等海量数据场景

5月18日,腾讯云发布首款全自研分布式分析型数据库TDSQL-A,全力应对海量数据实时分析需求。 这是腾讯云数据库在品牌升级后的首次新品发布,意味着腾讯云将这种多年积累的经验更加广泛全面地向社会行业开放,助力行业推进数字化进程…

Spring Boot 和 testNG 和 eclipse背景色

通过之前的博文,我们已经验证,Spring环境下完成access数据访问没有问题。下面我们直接在Spring环境下部署我们的升级项目。1.导入Spring BootSpring Boot是Spring的子项目,用来解决项目配置复杂性的问题,降低Spring的使用门槛使得…

免费丨AI内行盛会!2021北京智源大会带你与图灵奖和200+位大牛一起共话AI

数据在爆炸,AI在茁壮。从2012到2018年,深度学习模型的计算能力增长了30万倍,早已打破摩尔定律。可以预见的是,未来必然属于超大数据和超大模型,而破纪录的中文预训练生成语言模型智源“悟道2.0”发布在即,A…

LVM创建,缩减及快照备份

管理逻辑卷工具:LVM逻辑卷:灵活可动态存储的一种逻辑上的存储最底层需要通过工具变成“物理卷”:存储设备,Raid ,分区等VG:(1)底层设备容量之和。(2)PE大小*数量卷组上面…

前端 排序算法总结

前言 排序算法可能是你学编程第一个学习的算法,还记得冒泡吗? 当然,排序和查找两类算法是面试的热门选项。如果你是一个会写快排的程序猿,面试官在比较你和一个连快排都不会写的人的时候,会优先选择你的。那么&#xf…

django 快速实现登录

前言 对于web开来说,用户登陆、注册、文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说不具有很强的操作性;对于web应用来说&…

“云智一体”的全场景智能视频技术是什么?

全视频时代到来,各行各业对视频的应用、体验和效能提出全新升级需求,AI与云计算的发展则为智能视频进入新阶段注入充足动力。5月13日,百度智能云“云智技术论坛-智能视频专场”活动在北京举行,重磅发布了智能视频云3.0全景图。百度…

背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue...

原文:背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue[源码下载] 背水一战 Windows 10 (18) - 绑定: 与 Element 绑定, 与 Indexer 绑定, TargetNullValue, FallbackValue作者:webabcd介绍背水一战 Windows 10…

2-sat问题,输出方案,几种方法(赵爽的论文染色解法+其完全改进版)浅析 / POJ3683...

本文原创于 2014-02-12 09:26。 今复习之用,有新体会,故重新编辑。 2014-02-12 09:26: 2-sat之第二斩!昨天看了半天论文(赵爽的和俉昱的),终于看明白了!好激动有木有!终…

C#方法/函数

本节课向你介绍C#的方法,其目的是: 1.了解方法的结构格式2.了解静态和实例方法之间的区别3.学会实例对象的使用4.学会如何调用实例化的对象5.学会方法的四种参数类型的使用6.学会使用"this"引用以往,对于每个程序来说,所…

Python 的一万种用法:生成字符视频

作者 | ZackSock来源 | 新建文件夹X头图 | 下载于视觉中国前言在之前也写过生成字符视频的文章,但是使用的是命令行窗口输出,效果不是很好,而且存在卡顿的情况。于是我打算直接生成一个mp4的字符视频。大致思路和之前一样:Python2…

Codeforces 862B - Mahmoud and Ehab and the bipartiteness

862B - Mahmoud and Ehab and the bipartiteness 思路&#xff1a;先染色&#xff0c;然后找一种颜色dfs遍历每一个点求答案。 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,si…

C#表达式,类型和变量

本节课将介绍C# 语言的表达式&#xff0c;类型和变量。本节课要达到如下几个目的&#xff1a; 1.了解什么是"变量"2.学习C#的简单类型3.对C#表达式有个初步的了解4.了解什么是String类型5.学习如何使用数组"变量"仅仅是数据的存储位置。你可以把数据存放到…

张一鸣卸任CEO,立下10年之约,期望突破线性延伸

整理 | 寇雪芹头图 | 下载于视觉中国出品 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;5月20日&#xff0c;字节跳动创始人张一鸣发布内部全员信&#xff0c;宣布卸任CEO&#xff0c;联合创始人梁汝波将接任这一职位。张一鸣在全员信中表示&#xff0c;“我决定卸任CE…

【译】使用Kotlin和RxJava测试MVP架构的完整示例 - 第1部分

原文链接&#xff1a;android.jlelse.eu/complete-ex… 最近我创建了一个playground项目来了解更多关于Kotlin和RxJava的信息。 这是一个非常简单的项目&#xff0c;但有一部分&#xff0c;我进行了一些尝试&#xff1a;测试。 在kotlin的测试上可能会有一些陷阱&#xff0c;而…

智能改变未来,创新引领世界,第二届深圳国际人工智能展暨智能制造创新高峰论坛盛大启幕!

2021年5月20日&#xff0c;由深圳市科学技术协会、深圳市商务局、深圳市福田区人民政府共同指导&#xff0c;深圳市科技开发交流中心、深圳市人工智能行业协会联合主办的2021第二届深圳国际人工智能展开幕式暨智能制造创新高峰论坛在深圳会展中心&#xff08;福田&#xff09;启…

C#循环控制语句

本节课将介绍如何使用C#控制语句中的循环语句&#xff0c;本课目的如下&#xff1a; 1.学会"while"循环的用法。2.学会"do" 循环的用法。3.学会"for" 循环的用法。4.学会foreach循环的用法。5.进一步了解"break"语句的用法。6.如何使用…

2017-09-22 前端日报

2017-09-22 前端日报 精选 JavaScript 在 V8 中的元素种类及性能优化【译】异步递归&#xff1a;回调、Promise、Async[译]HTML&CSS Lesson5: 定位一个页面阻塞问题的排查过程前端分享之cookie的使用及单点登录An event for CSS position:stickyanvaka/ngraph.path: Path f…

C#选择控制语句

本节课将介绍如何使用C#选择控制语句&#xff0c;第三课将达到如下几个目的&#xff1a; 1.学会"if"语句的用法。2.学会"switch"语句的用法。3.学会在"switch"语句中如何使用"break"语句。4.理解"goto"语句的正确用法。在前…

将博客搬至51CTO

将博客搬至51CTO转载于:https://blog.51cto.com/imace/1540730

腾讯国风AI虚拟人学会作诗书法,背靠开源模型SongNet

5月21日&#xff0c;腾讯AI虚拟人艾灵再秀出新技能&#xff0c;首次展示AI作诗、AI书法等国风才艺&#xff0c;并与青年歌手白举纲跨次元合作&#xff0c;共同演唱国风新歌《百川千仞》。 AI“艾灵”诞生于腾讯AI Lab&#xff0c;来自实验性、探索性技术项目“多模态虚拟人”。…

Windows10安装Mysql5.7.19.0 msi 版本报错

安装环境&#xff1a;Windows10安装版本&#xff1a;MySql 5.7.19.0 msi1.安装5.7.19.0 msi版本Mysql时报如下错误&#xff1a;2.根据日志分析是缺少visual Studio 2013 Redistributable3.下载完成后&#xff0c;安装仍然显示失败&#xff1a;4.在网上下载各种vs测试&#xff0…

C#简单的欢迎程序

本节课通过介绍几个简单的程序&#xff0c;使得你对C#有所入门。本节程要达到如下几个目的&#xff1a; 1.理解一个C#程序的基本结构。2.初步了解"名称空间"的概念。3.初步了解"类"的概念。4.了解"Main"方法所做的工作。5.学会如何读取命令行输入…

知乎联合清华:开放国内最大个性化推荐实际交互数据集

5月21日&#xff0c;知乎联合清华大学对外开放基于知乎的大规模富文本查询和推荐数据集“ZhihuRec”。该数据集包含了知乎上的1亿个行为数据&#xff0c;是目前为止&#xff0c;国内用于个性化推荐的最大的实际交互数据集。 作为一个大型数据集&#xff0c;ZhihuRec具有社交化问…

SQL Server 2014 许可证(五)降级与升级

“版本”一词对应的英文单词有两个&#xff1a;&#xff08;1&#xff09; Version是指不同历史时期发生的产品&#xff0c;或者指产品不同的“代”&#xff0c;例如&#xff0c;SQL Server 2014 版本。&#xff08;2&#xff09; Edition是指在发行同一代产品&#xff08;Vers…

OCM_第十二天课程:Section6 —》数据库性能调优_ 资源管理器/执行计划

注&#xff1a;本文为原著&#xff08;其内容来自 腾科教育培训课堂&#xff09;。阅读本文注意事项如下&#xff1a;1&#xff1a;所有文章的转载请标注本文出处。2&#xff1a;本文非本人不得用于商业用途。违者将承当相应法律责任。3&#xff1a;该系列文章目录列表&#xf…

赠书 | 联邦学习如何在视觉领域应用?

前言&#xff1a;联邦学习是如何应用在视觉领域的&#xff1f;本文将通过一个获得了2020年AAAI人工智能创新应用奖的案例来向大家介绍。本案例是联邦学习在视觉、物联网、安防领域的实际应用&#xff0c;对分散在各地的摄像头数据&#xff0c;通过联邦学习&#xff0c;构建一个…

AME_Oracle自带AME审批链详解AME Standard Handler(概念)

2014-05-30 Created By BaoXinJian Oracle 自带了3大类&#xff0c;13个子类的审批链Action Type, 对应了13个标准的AME Standard Handler 1. 按主管层次审批 absolute job level / chains of authority based on absolute job levelfinal approver only / chains of authorit…

c# 中如何定义和接收消息

在C#中目前我还没有找到发送消息的类成员函数&#xff0c;所以只能采用通过调用WIN 32 API 的 SendMessage() 函数实现。由于 SendMessage的参数中需要得到窗体的句柄(handler) &#xff0c;所以又要调用另一个API FindWindow(), 两者配合使用&#xff0c;达到在不同窗体之间的…