JPA 主键生成策略

JPA 主键生成策略:
JPA 中有四种生成策略,生成规则由@GeneratedValue设定的
@GeneratedValue源码:
@Target({METHOD, FIELD})
@Retention(RUNTIME)
public @interface GeneratedValue {
    GenerationType strategy() default AUTO;
	/**可选,结合@SequenceGenerator、 @TableGenerator 使用*/
    String generator() default "";
}


package javax.persistence;
public enum GenerationType {
    TABLE,
    SEQUENCE,
    IDENTITY,
    AUTO
}

1、通过容器(程序)自动生成--GenerationType.AUTO

GenerationType.AUTO默认生成策略,由程序控制生成,可省略不写。

2、通过数据库自动增长字段生成,这种情况下需要数据库提供对自增长字段的支持,如SQL Server、MySQL、DB2、Derby等。
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private long id;
mysql:
id bigint(10) primary key AUTO_INCREMENT not null,
3、通过序列号生成主键,前提是数据库支持序列,如oracle
@Entity
// Define a sequence - might also be in another class:
@SequenceGenerator(name="seq", initialValue=1, allocationSize=100)
public class EntityWithSequenceId {
    // Use the sequence that is defined above:
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq")
    @Id long id;
}
4、通过数据库表字段保存主键
将当前主键的值单独保存到一个数据库的表中,主键的值每次都是从指定的表中查询来获得,
这种生成主键的方式也是很常用的。这种方法生成主键的策略可以适用于任何的数据库,
不必担心不同数据库不兼容造成的问题。
sql:
CREATE TABLE  tb_generator (  
  id int(20) NOT NULL auto_increment,  
  gen_name VARCHAR(255) NOT NULL,  
  gen_value int(20) NOT NULL,  
  PRIMARY KEY(id)  
)
插入记录,提供生成主键:
INSERT INTO tb_generator(gen_name, gen_value) VALUES ('USER_PK', 1);  
设置主键生成器:
@Id
@GeneratedValue(strategy = GenerationType.TABLE,generator="user_gen")
@TableGenerator(name = "user_gen",
                table="tb_generator",
                pkColumnName="gen_name",
                valueColumnName="gen_value",
                pkColumnValue="USER_PK",
                allocationSize=1
         )  

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”的值为“USER_PK”。 
initialValue表示主键初识值,默认为0。 
allocationSize表示每次主键值增加的大小,例如设置成1,则表示每次创建新记录后自动加1,默认为50。 

UniqueConstraint唯一性约束,只用于表生成的时候。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值