@GeneratedValue 四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO
2018-02-24 23:56
519 查看
一、JPA通用策略生成器
JPA提供四种标准用法,由@GeneratedValue的源代码:
其中GenerationType:
JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
TABLE:使用一个特定的数据库表格来保存主键。
SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
IDENTITY:主键由数据库自动生成(主要是自动增长型)
AUTO:主键由程序控制。
一:TABLE
这里应用表tb_generator,定义为
插入纪录,供生成主键使用
在主键生成后,这条纪录的value值,按allocationSize递增。
@TableGenerator的定义:
其中属性说明:
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
@SequenceGenerator定义
name属性表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中。
sequenceName属性表示生成策略用到的数据库序列名称。
initialValue表示主键初识值,默认为0。
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。
三:IDENTITY
四:AUTO
在指定主键时,如果不指定主键生成策略,默认为AUTO。
跟下面的定义是一样的
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)
相关文章推荐
- @GeneratedValue 四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
- @GeneratedValue 四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
- Annotation---------@GeneratedValue(strategy=GenerationType.AUTO)
- The database returned no natively generated identity value
- Execption:the database returned no natively generated identity value
- An explicit value for the identity column in table can only be specified when a column list is used and IDENTITY_INSERT is ON
- JPA主键生成策略 @GeneratedValue @SequenceGenerator @GenericGenerator
- HibernateSystemException: The database returned no natively generated identity value异常
- An explicit value for the identity column in table 'users' can only be specified when a column list
- 自增主键@GeneratedValue、@SequenceGenerator
- identity 列自动增长问题(SQL Server 2012 Auto Identity Column Value Jump Issue)
- SQL中FOR XML子句的各种用法,包括FOR XML字句的四种基本模式:AUTO模式、RAW模式、PATH模式和EXPLICIT模式
- The database returned no natively generated identity value
- appfuse 异常:no natively generated identity value
- 2013.04.04 The database returned no natively generated identity value
- AAuto的table用法测试
- Hibernate基础之五:自增主键@GeneratedValue、@SequenceGenerator
- Cannot insert explicit value for identity column in table 'settings' when IDENTITY_INSERT is set to OFF.
- The database returned no natively generated identity value 错误的解决
- @GeneratedValue的用法