• 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受欢迎的原因。




          

  • 相关阅读:
    MySQL基础
    MySQL约束
    firefox插件hostadmin自由切换host
    ITerm2下使用ssh访问Linux
    web优化(一 前端)
    php类的魔术方法也就是带下划线的类方法介绍及应用
    数据库水平切分的实现原理(分库,分表,主从,集群,负载均衡)
    三年以上php开发经验常见面试题
    php海量架构
    一个高级PHP工程师所应该具备的(转自元如枫博客)
  • 原文地址:https://www.cnblogs.com/zsswpb/p/6329436.html
Copyright © 2020-2023  润新知