@GeneratedValue 四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO

一、JPA通用策略生成器 
JPA提供四种标准用法,由@GeneratedValue的源代码:

    @Target({METHOD,FIELD})
    @Retention(RUNTIME)
    public @interface GeneratedValue{
        GenerationType strategy() default AUTO;
        String generator() default "";
    }   

其中GenerationType:

public enum GenerationType{
    TABLE,
    SEQUENCE,
    IDENTITY,
    AUTO
} 

JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. 
TABLE:使用一个特定的数据库表格来保存主键。 
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
IDENTITY:主键由数据库自动生成(主要是自动增长型) 
AUTO:主键由程序控制。

一:TABLE

@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator="payablemoney_gen")
@TableGenerator(name = "pk_gen",
    table="tb_generator",
    pkColumnName="gen_name",
    valueColumnName="gen_value",
    pkColumnValue="PAYABLEMOENY_PK",
    allocationSize=1
)

这里应用表tb_generator,定义为

CREATE TABLE  tb_generator (
  id NUMBER NOT NULL,
  gen_name VARCHAR2(255) NOT NULL,
  gen_value NUMBER NOT NULL,
  PRIMARY KEY(id)
) 

插入纪录,供生成主键使用

INSERT INTO tb_generator(id, gen_name, gen_value) VALUES (1,PAYABLEMOENY_PK‘, 1); 

在主键生成后,这条纪录的value值,按allocationSize递增。

@TableGenerator的定义:

@Target({TYPE, METHOD, FIELD})
@Retention(RUNTIME)
public @interface TableGenerator {
  String name();
  String table() default "";
  String catalog() default "";
  String schema() default "";
  String pkColumnName() default "";
  String valueColumnName() default "";
  String pkColumnValue() default "";
  int initialValue() default 0;
  int allocationSize() default 50;
  UniqueConstraint[] uniqueConstraints() default {};
}  

其中属性说明: 
name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。 
table属性表示表生成策略所持久化的表名,例如,这里表使用的是数据库中的“tb_generator”。 
catalog属性和schema具体指定表所在的目录名或是数据库名。 
pkColumnName属性的值表示在持久化表中,该主键生成策略所对应键值的名称。例如在“tb_generator”中将“gen_name”作为主键的键值 
valueColumnName属性的值表示在持久化表中,该主键当前所生成的值,它的值将会随着每次创建累加。例如,在“tb_generator”中将“gen_value”作为主键的值 
pkColumnValue属性的值表示在持久化表中,该生成策略所对应的主键。例如在“tb_generator”表中,将“gen_name”的值为“CUSTOMER_PK”。 
initialValue表示主键初识值,默认为0。 
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。 
UniqueConstraint与@Table标记中的用法类似。

二:SEQUENCE

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

@SequenceGenerator定义

@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。

三:IDENTITY

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)  

四:AUTO

@Id
@GeneratedValue(strategy = GenerationType.AUTO)  

在指定主键时,如果不指定主键生成策略,默认为AUTO。

@Id  

跟下面的定义是一样的

@Id
@GeneratedValue(strategy = GenerationType.AUTO)  

原文地址:https://www.cnblogs.com/zsg88/p/8446536.html

时间: 2024-08-06 05:18:26

@GeneratedValue 四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO的相关文章

lua中for循环的四种遍历方式

lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一个键值对 ipairs 取从key==1开始的顺序整数最大值,每个键值对 参考http://rangercyh.blog.51cto.com/1444712/1032925 不过有一个问题, tbtest = { [1] = 1, [2] = 2, [4] = 4, } print(#(tbtest))

[java]static关键字的四种用法

在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构.下面我们先来了解一下static关键字及其用法. static关键字 1.修饰成员变量 在我们平时的使用当中,static最常用的功能就是修饰类的属性和方法,让他们成为类的成员属性和方法,我们通常将用static修饰的成员称为类成员或者静态成员,这句话挺起来都点奇怪,其实这是相对于对象的属性和方法来说的.请看下面的例子:(未避

C#播放声音的四种方法 +AxWindowsMediaPlayer的详细用法

C#播放声音的四种方法 第一种是利用DirectX 1.安装了DirectX SDK(有9个DLL文件).这里我们只用到MicroSoft.DirectX.dll和 Microsoft.Directx.DirectSound.dll2.引入DirectX 的DLL文件的名字空间:  [C#] 纯文本查看 复制代码 ? 01 02 using Microsoft.DirectX; usingMicrosoft.DirectX.DirectSound; 3.建立设备Device dv=newDevi

GB2312,GBK,GB18030,UTF8四种汉字编码标准有什么区别和联系

 从GB2312.GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符.在这些编码中,英文和中文可以统一地处理.区分中文编码的方法是高字节的最高位不为 0.按照程序员的称呼,GB2312.GBK 到 GB18030 都属于双字节字符集 (DBCS). 以下是这四种字符集的包含关系:GB2312 < GBK < GB18030 < UTF8 ---------------------------------------

mysql中模糊查询的四种用法介绍

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为“张三”,“张猫三”.“三脚猫”,“唐三藏”等等有“三”的记录全找出来. 另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件 SELECT * FROM [user] WHERE u_name LIKE

C++ Primer 学习笔记_23_类与数据抽象(9)--四种对象生存期和作用域、static 用法总结

C++ Primer 学习笔记_23_类与数据抽象(9)--四种对象生存期和作用域.static 用法总结 前言: 从上图可知,程序占用的内存被分了以下几部分. (1).栈区(stack) 存放函数的参数值,局部变量的值等,内存的分配是连续的.栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被销毁,其特点是效率高,但空间大小有限 注意:通常栈空间容量比较小,一般是1MB-2MB,所以体积比较大的对象不适合在栈中分配. (2).堆区(heap) 由malloc系列函数或new操作符

c++中for的四种用法。

#include <algorithm> #include <vector> #include <iostream> using namespace std; int main() { int nArray[] = {0, 1, 2, 3, 4, 5}; std::vector<int> vec(nArray, nArray + 6); // 第一种用法:最原始的语法(用下标) for (int i = 0; i < vec.size(); ++i)

mysql进阶 六 模糊查询的四种用法介绍

mysql中模糊查询的四种用法介绍 这篇文章主要介绍了mysql中模糊查询的四种用法,需要的朋友可以参考下. 下面介绍mysql中模糊查询的四种用法: 1%: 表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为“张三”,“张猫三”.“三脚猫”,“唐三藏”等等有“三”的记录全找出来. 另外,如果需要找出u_name中既有“三”又有

Final基本的四种用法

final关键字代表最终.不可改变的. 常见四种用法:1. 可以用来修饰一个类2. 可以用来修饰一个方法3. 还可以用来修饰一个局部变量4. 还可以用来修饰一个成员变量 Java中有四种权限修饰符: public > protected > (default) > private同一个类(我自己) YES YES YES YES同一个包(我邻居) YES YES YES NO不同包子类(我儿子) YES YES NO NO不同包非子类(陌生人) YES NO NO NO 注意事项:(de