理解JPA注解@GeneratedValue的使用方法
https://blog.csdn.net/u012838207/article/details/80406716
一、JPA通用策略生成器
通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id,
其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法,
JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出.
|
1
2
3
4
5
6
|
Target({METHOD,FIELD}) @Retention(RUNTIME) public @interface GeneratedValue{ GenerationType strategy() default AUTO; String generator() default ""; } |
其中GenerationType:
|
1
2
3
4
5
6
|
public enum GenerationType{ TABLE, SEQUENCE, IDENTITY, AUTO } |
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
- TABLE:使用一个特定的数据库表格来保存主键。
- SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
- IDENTITY:主键由数据库自动生成(主要是自动增长型)
- AUTO:主键由程序控制。
TABLE比较复杂,这里不讲解。分别介绍其他三个:
1.SEQUENCE
实体类中的注解
|
1
2
3
|
@Id@GeneratedValue(strategy =GenerationType.SEQUENCE,generator="aaa") @SequenceGenerator(name="aaa", sequenceName="seq_payment") |
@SequenceGenerator定义
|
1
2
3
4
5
6
7
8
|
@Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME) public @interface SequenceGenerator { String name(); String sequenceName() default ""; int initialValue() default 0; int allocationSize() default 50; } |
- name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
- sequenceName属性表示生成策略用到的数据库序列名称。
- initialValue表示主键初识值,默认为0。
- allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。
2.IDENTITY
主键则由数据库自动维护,使用起来很简单
|
1
2
|
@Id@GeneratedValue(strategy = GenerationType.IDENTITY) |
3、AUTO
默认的配置。如果不指定主键生成策略,默认为AUTO。
|
1
2
|
@Id@GeneratedValue(strategy = GenerationType.AUTO) |
二、hibernate主键策略生成器
hibernate提供多种主键生成策略,有点是类似于JPA,有的是hibernate特有,下面列出几个Hibernate比较常用的生成策略:
- native: 对于 oracle 采用 Sequence 方式,对于MySQL 和 SQL Server 采用identity(自增主键生成机制),native就是将主键的生成工作交由数据库完成,hibernate不管
- uuid: 采用128位的uuid算法生成主键,uuid被编码为一个32位16进制数字的字符串。占用空间大(字符串类型)。
- assigned: 在插入数据的时候主键由程序处理(即程序员手动指定),这是 <generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。
- identity: 使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequence(MySQL 和 SQL Server 中很常用)。 等同于JPA中的INDENTITY。
- increment: 插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法。
hibernate提供了多种生成器供选择,基于Annotation的方式通过@GenericGenerator实现.
hibernate每种主键生成策略提供接口org.hibernate.id.IdentifierGenerator的实现类,如果要实现自定义的主键生成策略也必须实现此接口.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public interface IdentifierGenerator { /** * The configuration parameter holding the entity name */ public static final String ENTITY_NAME = "entity_name"; /** * Generate a new identifier. * @param session * @param object the entity or toplevel collection for which the id is being generated * * @return a new identifier * @throws HibernateException */ public Serializable generate(SessionImplementor session, Object object) throws HibernateException; } |
IdentifierGenerator提供一generate方法,generate方法返回产生的主键.
三、@GenericGenerator
自定义主键生成策略,由@GenericGenerator实现。
hibernate在JPA的基础上进行了扩展,可以用一下方式引入hibernate独有的主键生成策略,就是通过@GenericGenerator加入的。
比如说,JPA标准用法
|
1
2
|
@Id@GeneratedValue(GenerationType.AUTO) |
就可以用hibernate特有以下用法来代替:
|
1
2
3
|
@Id@GeneratedValue(generator = "paymentableGenerator") @GenericGenerator(name = "paymentableGenerator", strategy = "assigned") |
@GenericGenerator的定义:
|
1
2
|
@Target({PACKAGE, TYPE, METHOD, FIELD}) @Retention(RUNTIME) |
源代码如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public @interface GenericGenerator { /** * unique generator name */ String name(); /** * Generator strategy either a predefined Hibernate * strategy or a fully qualified class name. */ String strategy(); /** * Optional generator parameters */ Parameter[] parameters() default {}; } |
- name属性指定生成器名称。
- strategy属性指定具体生成器的类名。
- parameters得到strategy指定的具体生成器所用到的参数。
对于这些hibernate主键生成策略和各自的具体生成器之间的关系,在org.hibernate.id.IdentifierGeneratorFactory中指定了,
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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); } |
上面十二种策略,加上native,hibernate一共默认支持十三种生成策略。使用hibernate注解示例如下:
|
1
2
3
|
@Id@GeneratedValue(generator = "IDGenerator")@GenericGenerator(name = "IDGenerator", strategy = "identity") |
这种完全类似于:
|
1
2
|
@Id@GeneratedValue(strategy=GenerationType.IDENTITY) |
理解JPA注解@GeneratedValue的使用方法的更多相关文章
- JPA注解@GeneratedValue
@GeneratedValue是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以看出. public enum GenerationType { TABLE, ...
- JPA之@GeneratedValue注解(转)
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...
- JPA之@GeneratedValue注解
JPA的@GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键), ...
- springBoot注解大全JPA注解springMVC相关注解全局异常处理
https://www.cnblogs.com/tanwei81/p/6814022.html 一.注解(annotations)列表 @SpringBootApplication:包含了@Compo ...
- jpa 注解使用说明
1.@Entity(name="EntityName") 必须,name为可选,对应数据库中一的个表 2.@Table(name="",catalog=&quo ...
- Java、Hibernate(JPA)注解大全
1.@Entity(name=”EntityName”) 必须,name为可选,对应数据库中一的个表 2.@Table(name=””,catalog=””,schema=””) 可选,通常和@Ent ...
- JPA注解开发
JPA注解开发 jpa是sun公司的一个ORM规范,只有接口和注解,没有具体实现. jpa是EJB3中的. 单表常用注解 书写注解,并配置 @Entity @Table(name = "c_ ...
- Hibernate 和 JPA 注解
转载请注明:Hibernate 和 JPA 注解 | 言曌博客 1.@Entity(name="EntityName") 必须, name为可选,对应数据库中一的个表 2.@Tab ...
- (转)深入理解Java注解类型(@Annotation)
背景:在面试时候问过关于注解的问题,工作中也用到过该java的特性,但是也没有深入的了解. 秒懂,Java 注解 (Annotation)你可以这样学 ps:注解最通俗易懂的解释 注解是一系列元数据, ...
随机推荐
- 【LeetCode】在排序数组中查找元素的第一个和最后一个位置【三次二分】
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- C# - Array.Sort()方法
Array类简介 Array类是C#中所有数组的基类.我们常用的[]声明数组即为Array类的语法,我们可通过Array类提供的各种方法对C#中数组进行操作.最典型的就是数组排序 Array.Sort ...
- mysql存储过程的函数
存储过程和函数:类似java中的方法 好处:提高代码的重用性 .简化操作.减少了和数据库连接的次数,提高了效率 含义:一组预先编译好的sql语句集合,成批处理语句 语法: 一:创建语法 create ...
- 在Asp.Net Core MVC 3.0 视图运行时编译
在正常情况下,视图在生成的时候就会变为 xxx.Views.dll,在开发的时候,这样很不方便,因为很多的时候,我们只是修改一个样式,调整一些JavaScript代码,这个时候要把项目调试暂停下来,生 ...
- 上传文件至Github仓库
Github的使用 创建一个本地的版本库(也就是一个文件夹) 新建文件夹,或使用Git bash命令行窗口创建 $ mkdir test $ cd test 在命令行中输入 git init把这个文件 ...
- vue-cli2和3中的config
最近在网上找了个vue搭建的后台管理的框架,在使用的时候发现没有了config和build文件夹,所以当时就蒙圈了,以为是作者自己改了什么东西,所以感觉自己不知道从何下手了,不过通过查资料发现原来是v ...
- Js基本语句
js基本语句整理导向图 ---欢迎收藏^ - ^
- 【Maven】Maven中排除依赖、归类依赖、优化依赖
参考博文:Maven中排除依赖.归类依赖.优化依赖
- Docker11-实战-部署多套环境
目录 创建本地挂载目录 准备一个简单的java web项目 启动Tomcat容器:通过挂载不同的代码目录和运行端口来区分 案例:修改测试环境代码 创建本地挂载目录 在宿主host主机上面创建两个目录, ...
- angular8 打包时 文件过大 导致内存溢出解决方案(记录)
在package.json 中添加 "scripts": { "ng": "ng", "start": "ng ...