当前位置:   article > 正文

JPA-主键生成策略_strategy = generationtype.identity

strategy = generationtype.identity

hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的
@GeneratedValue注解的strategy属性指定具体的策略基本使用的有四种策略

GenerationType.IDENTITY

规则

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

用法:

@Id  
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long custId; 
  • 1
  • 2
  • 3

GenerationType.SEQUENCE

规则:

根据底层数据库的序列来生成主键,条件是数据库支持序列。当有些数据库不支持自增的时候就使序列策略。只有部分数据库(Oracle,PostgreSQL,DB2)支持序列对象,所以该策略一般不应用于其他数据库。类似的,该策略一般与另外一个注解一起使用@SequenceGenerator,@SequenceGenerator注解指定了生成主键的序列.然后JPA会根据注解内容创建一个序列(或使用一个现有的序列)。如果不指定序列,则会自动生成一个序列SEQ_GEN_SEQUENCE。
用法:

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


  //@SequenceGenerator源码中的定义
  @Target({TYPE, METHOD, FIELD})   
  @Retention(RUNTIME)  
  public @interface SequenceGenerator {  
     //表示该表主键生成策略的名称,它被引用在@GeneratedValue中设置的“generator”值中
     String name();  
     //属性表示生成策略用到的数据库序列名称。
     String sequenceName() default "";  
     //表示主键初识值,默认为0
     int initialValue() default 0;  
     //表示每次主键值增加的大小,例如设置1,则表示每次插入新记录后自动加1,默认为50
     int allocationSize() default 50;  
  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

GenerationType.AUTO(如果@GeneratedValue不指定策略默认为该策略)

主键由程序控制

用法:

@Id  
@GeneratedValue(strategy = GenerationType.AUTO)  
private Long custId;
  • 1
  • 2
  • 3

和table的模式是差不多的也是会创建一张表来控制主键的生成,指定下一条记录的id

GenerationType.TABLE

规则
使用一个特定的数据库表格来保存主键,开启这个模式之后他会自动生成一个表来控制主键的生成,这张表中指定了下一个创建的记录的id
用法
① 只是指定策略

@Id//声明当前私有属性为主键
@GeneratedValue(strategy = GenerationType.TABLE)
@Column(name="cust_id") //指定和表中cust_id字段的映射关系,name表示数据库字段的名称
private Long custId
  • 1
  • 2
  • 3
  • 4

库就会建立如下的一张表,里面记录了下一次添加记录需要用的id,其中sequence_name使用來保存主键名的字段(默认为default),而next_val是主键值,也就是下一次添加的记录的id
在这里插入图片描述
② 手动指定存储的表和字段以及递增步长

@Id//声明当前私有属性为主键
@GeneratedValue(strategy = GenerationType.TABLE, generator = "id_sequence")
@TableGenerator(name = "id_sequence", allocationSize = 1, table = "sequence_table", pkColumnName = "name", valueColumnName = "value",pkColumnValue = "customer")
@Column(name="cust_id") //指定和表中cust_id字段的映射关系,name表示数据库字段的名称
private Long custId
  • 1
  • 2
  • 3
  • 4
  • 5

其中@GeneratedValue中strategy是指定策略,generator是指定表格的生成策略的名称
@TableGenerator注解中的含义
在这里插入图片描述
生成的表
在这里插入图片描述
表中的数据
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/739675
推荐阅读
  

闽ICP备14008679号