2.1 注解主键生成策略(Generated identifier values)

来源:互联网 发布:软件应用的英文 编辑:程序博客网 时间:2024/06/06 14:02

@GeneratedValue,JPA通用策略生成器 。

JPA提供的四种标准用法为IDENTITY,AUTO,TABLE,SEQUENCE

1、IDENTITY——主键由数据库自动生成

@GeneratedValue(strategy = GenerationType.IDENTITY)

MySQL使用AUTO_INCREMENT、微软的SQLServer使用IDENTITY

2、AUTO——自动选择合适的生成策略

@GeneratedValue(strategy = GenerationType.AUTO)

MySQL里面生成一个特殊的表来记录id,默认的表明为hibernate_sequence。另外在数据库新建一个表放置更新的主键,每次都要update,效率较低。

下面是创建User实例后并插入100条数据后,数据库生成的两个表,分别为User和hibernate_sequencehibernate_sequence中记录了下一个主键的值


通过DEBUG信息,可以看出生成策略大概的运行机制(创建hibernate_sequence表—>插入生成值—>取出值—>更新值)


3、TABLE——使用自定义表来记录

@GeneratedValue(strategy = GenerationType.TABLE)

默认情况下,使用hibernate_sequences来记录id的值

使用@TableGenerator可以指定表名、列名

// 自定义基于表的生成器

@TableGenerator(

       name = "table-generator",//生成器名称

       table = "table_identifier",//数据库表名,记录下一个id值的总表

       pkColumnName = "table_name",//序列名称,哪个domain用的

       valueColumnName = "product_id",//存储id的列表,实际的值

       allocationSize = 100//每次更新的id值的数量

 )

@GeneratedValue(

       strategy = GenerationType.TABLE,  //指定表生成策略

       generator = "table-generator"  // 指定生成器名称

)

下面是创建User实例后并插入100条数据后,数据库生成的两个表,分别为user和user_identifier


DEBUG信息如下:


4、SEQUENCE——根据数据库底层序列来获取主键值,前提是数据库需要支持序列(如Oracle)

      @SequenceGenerator(

       name = "sequence-generator", //生成器名称

       sequenceName = "product_sequence"//序列名称

       )
      @GeneratedValue(

       strategy = GenerationType.SEQUENCE,//指定序列生成策略

       generator = "sequence-generator" //生成器名称

       )


@GenericGenerator ,hibernate主键策略生成器

1、UUID

       @Id

       @GeneratedValue(generator= "uu" // 指定生成器名称

       )

       @GenericGenerator(// 定义生成器

                     name= "uu", // 生成器的名称

                     // 主键生成策略,Hibernate在初始化的时候,放了一个名为uuid2的生成器策略在内存里面

                    //strategy ="org.hibernate.id.UUIDGenerator"

                   strategy = "uuid2"

       )

通过strategy 指定不同的生成器,这些生成器必须实现IdentifierGenerator接口,常用的有:

 UUIDGenerator

符合国际规范的UUID生成策略,使用JDK自带的UUID类来实现

 UUIDHexGenerator

早期Hibernate提供的UUID生成器,被UUIDGenerator代替了

 TableGenerator

基于数据库表的生成策略,相当于@GeneratedValue(strategy = GenerationType.TABLE)

 SequenceIdentityGenerator

相当于@GeneratedValue(strategy = GenerationType.SEQUENCE)

 SequenceHiLoGenerator

在复杂环境里面,也比较常用,如果集群太多,容易造成重复id。

2、hilo —— 使用一个高/低位算法生成的long、short或int类型的标识符,给定一个表和字段作为高位值的来源,默认的表是hibernate_unique_key,默认的字段是next_hi。它将id的产生源分成两部分,DB+内存,然后按照算法结合在一起产生id值,可以在很少的连接次数内产生多条记录,提高效率

        @GenericGenerator(name = "hilo_generator", strategy = "hilo")   //指定主键生成策略为hilo
        @GeneratedValue(generator="hilo_generator")

3、native ——根据底层数据库的能力,从identity、sequence、hilo中选择一个

@GenericGenerator(name = "native_generator", strategy = "native")//指定主键生成策略为native
@GeneratedValue(generator="native_generator")

4、assigned——在插入数据的时候主键由程序处理(很常用),这是 <generator>元素没有指定时的默认生成策略。等同于JPA中的AUTO。

5、seqhilo ——sequence和hilo的结合,hilo的高位由sequence产生

6、increment——由Hibernate在内存中生成主键,每次增量为1,不依赖于底层的数据库。

     因此所有的数据库都可以使用,但问题由于是Hibernate生成的,所以只能有一个Hibernate应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用 。插入数据的时候hibernate会给主键添加一个自增的主键,但是一个hibernate实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法

7、uuid.hex——使用一个128-bit的UUID算法生成字符串类型的标识符

8、foreign——使用外部表的字段作为主键

可参考该博文:http://blog.csdn.net/ygj26/article/details/5523781

原创粉丝点击