Java探索之Hibernate主键生成策略详细介绍

  


  

  

,,,,由Hibernate从数据库中去除主键的最大值(每个会话只取一次),以该值为基础,每次增量为1,在内存中生成主键,不依赖于底层的数据库,因此可以跨数据库。

        & lt; id=" id " name=" id "列在   & lt;发电机类="增量"/比;   & lt;/id>      

Hibernate调用org.hibernate.id.IncrementGenerator类里面的生成()方法,使用选择马克斯(idColumnName)从表名语句获取主键最大值。该方法被声明成了同步,所以在一个独立的Java虚拟机内部是没有问题的,然而,在多个JVM同时并发访问数据库选择最大时就可能取出相同的值,再插入就会发生Dumplicate条目的错误。所以只能有一个Hibernate应用进程访问数据库,否则就可能产生主键冲突,所以不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。
  

  

特点:跨数据库,不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

  

  

采用数据库提供的序列机制生成主键,需要数据库支持序列。如oralce, DB, SAP DB, PostgerSQL, McKoi中的sequence.MySQL这种不支持序列的数据库则不行(可以使用身份)。

        & lt;发电机类="序列"比;   & lt;参数名称="序列"祝辞hibernate_id   & lt;/generator>      

& lt;参数name="序列"祝辞hibernate_id指定序的名称
  

  

Hibernate生成主键时,查找序列并赋给主键值,主键值由数据库生成,Hibernate不负责维护,使用时必须先创建一个序列,如果不指定序列名称,则使用Hibernate默认的序列,名称为hibernate_sequence,前提要在数据库中创建该序列。
  

  

<>强特点:只能在支持序列的数据库中使用,如Oracle。

  

  

身份由底层数据库生成标识符.identity是由数据库自己生成的,但这个主键必须设置为自增长,使用身份的前提条件是底层数据库支持自动增长字段类型,如DB2, SQL Server, MySQL, Sybase和HypersonicSQL等,甲骨文这类没有自增字段的则不支持。
  

  

& lt; id=" id " name=" id "列在
  & lt;发电机类="身份"/祝辞
  & lt;/id>
  

  

例:如果使用MySQL数据库,则主键字段必须设置成auto_increment。
  id int(11)主键auto_increment
  

  

<>强特点:只能用在支持自动增长的字段数据库中使用,如MySQL。

  


  

  

,,,本机由hibernate根据使用的数据库自行判断采用身份,小矿脉,其序列中一种作为主键生成方式,灵活性很强。如果能支持身份则使用身份,如果支持序列则使用序列。
  

  

& lt; id=" id " name=" id "列在
  & lt;发电机类=氨镜亍?祝辞
  & lt;/id>
  

  

例如MySQL使用身份,甲骨文使用序列
  注意:如果Hibernate自动选择序列或者小矿脉,则所有的表的主键都会从Hibernate默认的序列或小矿脉表中取,并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高。
  使用序列或小矿脉时,可以加入参数,指定序列名称或嗨值表名称等,如
  & lt;参数名称="序列"祝辞hibernate_id
  

  

<强>,,,特点:根据数据库自动选择,项目中如果用到多个数据库时,可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等。
  

  


  

  

,,,UUID:统一的惟一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址,纳秒级时间,芯片ID码和许多可能的数字,标准的UUID格式为:
  

  

xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12)
  

  

其中每个x是0 - 9或f范围内的一个十六进制的数字。

        & lt; id=" id " name=" id "列在   & lt;发电机类=" uuid "/比;   & lt;/id>      

Hibernate在保存对象时,生成一个UUID字符串作为主键,保证了唯一性,但其并无任何业务逻辑意义,只能作为主键,唯一缺点长度较大,32位(Hibernate将UUID中间的”——“删除了)的字符串,占用存储空间大,但是有两个很重要的优点,Hibernate在维护主键时,不用去数据库查询,从而提高效率,而且它是跨数据库的,以后切换数据库极其方便。

Java探索之Hibernate主键生成策略详细介绍