zoukankan      html  css  js  c++  java
  • Hibernate 的主键生成策略

    原文链接:http://www.yiidian.com/hibernate/hibernate-generator.html

    Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制。

    1 生成策略配置格式

    用户User的实体类User.java

    package com.yiidian.domain;  
      
    import java.util.Date;  
      
    public class User {  
      
           private String id;          
           private String name;   
           public User(){}  
           public String getId() {  
               return id;  
           }  
           public void setId(String id) {  
               this.id = id;  
           }  
           public String getName() {  
               return name;  
           }  
           public void setName(String name) {  
               this.name = name;  
           }  
      
    }  
    

    User.java对应的映射文件User.hbm.xml

    <?xml version="1.0"?>  
    <!DOCTYPE hibernate-mapping PUBLIC   
      "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    <hibernate-mapping>  
       <class name="com.yiidian.domain.User">  
                <id name="id">  
      
                         <generator class="uuid"/>  
      
                </id>  
                <property name="name"/>  
                <property name="password"/>                     
       </class>  
      
    </hibernate-mapping> 
    

    其中

     <id name="id" column="表主键字段名" type="java.lang.Integer">
            <generator class="设置主键生成策略类型"/>
     </id>
    

    2 Hibernate常用的主键策略

    2.1 increment

    对主键值采取自动顺序增长的方式生成新的主键,值默认从1开始。
    原理:在当前应用实例中维持一个变量,以保存当前最大值,之后每次需要生成主键值的时候将此值加1作为主键.不依赖于底层的数据库,因此所有的数据库都可以使用
    缺点:通过increment的生成主键的原理可推断,此种主键生成策略不适用于集群、同一时段大量用户并发访问的系统,既当大量用户同一时间段同时进行插入操作的时候,可能存在取得相同的最大值然后再同时+1的情况,这个时候就会造成主键冲突。因此,如果同一数据库有多个实例访问,此方式必须避免使用。

    2.2 UUID

    原理UUID使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。所以使用于所有数据库。
    特点;能够保证数据库中的主键唯一性,但是在生成的主键占用比较多的存贮空间

    2.3 Hilo

    原理:通过hi/lo 算法(Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来)实现的主键生成机制,需要额外的数据库表保存主键生成历史状态。
    特点:需要额外的数据库表和字段提供高位值来源。默认情况下使用的表是   hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo主键生成方式由Hibernate 维护,所以Hilo方式与底层数据库无关。

    2.4 sequence

    sequence实际是就是一张单行单列的表。
    实现原理:调用数据库中底层存在的sequence生成主键,需要底层数据库的支持序列,因此他是依赖于数据库的。
    支持sequence的数据库有:Oracle 、DB2(Mysql/SQlServer不支持)、PostgreSql、SAPDb等

    2.5 identity

    根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。
    特点: 与底层数据库有关,要求数据库支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity。支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。
    好处:在建表的时候指定了id为自动增长,实际开发中就不需要自己定义插入数据库的主键值,系统会自动顺序递增一个值 。Identity无需Hibernate和用户的干涉,使用较为方便,但由于依赖于数据库,所以不便于在不同的数据库之间移植程序。  

    2.6 native

    作用:根据数据库的类型,自动在sequence 、identity和,hilo进行切换。
    实现自动切换的依据:根据Hibernate配置文件中的方言来判断是Oracle还是Mysql、SqlServer,然后针对数据库的类型抉择 sequence还是identity作为主键生成策略。
    用处:由于Hibernate会根据底层数据库采用不同的映射方式,因此灵活性高,便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。

    2.7 assigned

    作用:用于手工分配主键生成器,一旦指定为这个了,Hibernate就不在自动为程序做主键生成器了。没有指定标签时,默认就是assigned主键的生成方式
    使用方法:在程序中session.save();之前,由程序员自己指定主键值为多少。
    例如:user.setId(1);这就是在程序中程序员手动为用户表指定主键值为1。

    2.8 foreign

    只适用基于共享主键的一对一关联映射的时候使用。即一个对象的主键是参照的另一张表的主键生成的。

    3 Hibernate主键生成策略分类

    UUID,increment、Hilo、assigned:对数据库无依赖
    identity:依赖Mysql或sql server,主键值不由hibernate维护
    sequence:适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。
    native:根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。

    4 Hibernate主键生成策略的选择

    一般来说推荐UUID,因为生成主键唯一,且对数据库无依赖,可移植性强。

    由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数据库提供的主键生成机制上,采用native,sequence或者identity的主键生成方式。

    不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳大量并发insert数据时可能会引起表之间的互锁。

    因此,对于并发Insert要求较高的系统,推荐采用uuid作为主键生成机制。

    总之,hibernate主键生成器选择,还要具体情况具体分析。一般而言,利用uuid方式生成主键将提供最好的性能和数据库平台适应性。

    file

    欢迎关注我的公众号::一点教程。获得独家整理的学习资源和日常干货推送。
    如果您对我的系列教程感兴趣,也可以关注我的网站:yiidian.com

  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/yiidian/p/12564193.html
Copyright © 2011-2022 走看看