Hibernate主键生成策略

         Hibernate主键生成策略有很多种,正如设置不同的数据类型一样,设置不同的主键生成策略,也是适用于不同的场景。接下来一一来看不同的生成策略,有什么作用和优缺点。


 1、identity[自然递增]

      identity是底层数据库生成的标识符。identity是由数据库自己生成的,而且这个主键必须设置为自增长的,使用identity的前提是数据库必须支持自增长的类型,如mysql、SQL server等,而Oracle没有自增长字段故不支持。

缺点:由于需要数据库来维护,会占用数据库资源。

<id name="id" column="id">
        <generator class="identity">
</id>

2、sequence[序列]

       需要底层数据库的支持,并由数据库维护这个sequence序列。支持Oracle、DB2等数据库,用于long或short或int类型生成唯一标识。

 

<generator class="sequence">

      <param name="sequence">hibernate_id</param>

</generator>

<param name="sequence">hibernate_id</param> 指定sequence的名称

 注意:Hibernate生成主键时,查找sequence并赋给主键值,主键值由数据库生成,Hibernate不负责维护,使用前必须先创建一个sequence。


3、native

     根据数据库自动选择生成策略,对于mysql、SQL server采用identity生成策略;对于Oracle,则采用sequence策略。

 

<id name="id" column="id">

     <generator class="native" />

</id>


4、uuid

     UUID全程:universally unique identifier 。采用128位算法生成主键,能够保证网络环境下主键唯一性,也能够保证在不同数据库及不同服务下主键的唯一性。

      Hibernate在保存对象时,生成一个UUID主键,保证了唯一性,不用去查询数据库,有Hibernate自己维护,从而提高了效率,而且由于是跨数据库的,以后切换数据源极其方便。

      特点:

             UUID 长度达,唯一性、占用数据库。

             跨数据库,移植方便。

             不用访问数据库生成主键,效率高。

<id name="id" column="id">

     <generator class="uuid" />

</id>


5、foreign

     使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。

<id name="id">
      <generator class="foreign">
<span style="white-space:pre">	</span>   <param name="property">idCard</param>
      </generator>
</id>
<property name="name"/>
<one-to-one name="idCard" constrained="true"/>

注:实际中很少采用该方式,这种方式只针对一对一,当需要需要变化,需要改变为一对多非常困难。

 

总结:

       Hibernate的主键生成策略,除了这五种还有assigned,increment,Hilo等,但这五种更加常见,我们在现实中用到的最多的UUID,这个方式由Hibernate来为主键赋值,不是由程序生成,保证了对象标识符的唯一性与不可变行,而且与其他的需要由数据库来维护主键的生成策略来说效率更高,而且可移植性更高,所以这也是为什么UUID受欢迎的原因。




      

原文地址:https://www.cnblogs.com/zsswpb/p/5811559.html