zoukankan      html  css  js  c++  java
  • hibernate主键自动生成

    Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等。因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态(Transient),而int,long不能设置为null,不具备该功能。
    <!--以上抄书,待研究论证-->

    Java代码 复制代码 收藏代码
    1. <id  name="属性名"column="数据库字段名" type="标识Hibernate类型的名字"    
    2.      unsaved-value="null|any|none|undefined|id_value"  
    3.      access="field|property|ClassName">                       
    4.            
    5.      <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>   
    6. </id>  
    <id  name="属性名"column="数据库字段名" type="标识Hibernate类型的名字" 
         unsaved-value="null|any|none|undefined|id_value"
         access="field|property|ClassName">                    
            
         <generator class="assigned|increment|identity|sequence|hilo|seqhilo|native|uuid|guid|select|foreign"/>
    </id>
    


    如果 name属性不存在,会认为这个类没有标识属性
    unsaved-value 参考http://blog.csdn.net/chunkyo/article/details/660050
    access(可选 - 默认为property): Hibernate用来访问属性值的策略。 (网上查不到什么资料)

    generator
    1、assigned:
       在调用session.save()之前,必须手动setId(主键值),否则出错。
       <generator>没有指定时的默认生成策略。
    2、increment:自增长,为long, short或者int类型生成主键
       自动增长,由hibernate维护,适用于所有的数据库,每次插入数据前先查询最大id(select max(id) from xxx),即使id已经设好值,无视。
       缺点:不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
    3、identity:自增长
        与increment不同的是:
        a)identity不是由hibernate控制,而是由数据库控制自增长,所插入数据前不会查询最大id。
        b)以Mysql为例,如果主键字段没有开启auto_increment,会抛异常"Field 'id' doesn't have a default value"。
        c)increment的insert语句包括id,identity的insert语句没有id字段。
        c)假设有五条数据,id分别为1、2、3、4,删除(3、4)后,用increment增加数据id为3,用identity增加数据id为5。
        不同的数据库有不同的自增长方式。如MySql是auto_increment,SQL Server 中是Identity。支持的数据库:MySql、SQL Server、DB2、Sybase和HypersonicSQL。
        优点: 不需要Hibernate和用户的干涉,使用较为方便。
        缺点:但不便于在不同的数据库之间移植程序。
    4、sequence:自增长
        需要底层数据库支持Sequence方式。
        实现了Sequence的数据库:Oracle、DB2、PostgreSQL。
        没有实现Sequence的数据库:  MySQL、SQL Server、Sybase。
        如果在MySql中使用该方式,hibernate会根据Dialect判断报错。
    5、hilo:hi/low(高低位)算法,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。

    Java代码 复制代码 收藏代码
    1. <generator class="hilo" >   
    2.              <param name="table">hi_value</param>   
    3.              <param name="column">next_value</param>   
    4.              <param name="max_lo">100</param>   
    5. </generator>  
    <generator class="hilo" >
                 <param name="table">hi_value</param>
                 <param name="column">next_value</param>
                 <param name="max_lo">100</param>
    </generator>


        hibernate根据hilo生成器生成主键的过程:
         (1)读取并记录数据库的hi_value表中next_value字段的值,数据库中此字段值加1保存
         (2)hibernate取得lo值(0到max_lo-1循环,lo到max_lo时,执行步骤1,然后lo继续从0到max_lo循环)
         (3)取得hi值和lo值后,根据下面的公式计算主键值:hi*(max_lo+1)+lo;
         过程参考:http://hi.baidu.com/sai5d/blog/item/88e5f4db09e90277d0164e30.html
        个人感觉没有自增长好,不仅多维护一个表,每次插入数据都要进行查和修改next_value的值。
    6、seqhilo基于sequence的hilo算法。
    7、native:
       Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
      特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
         疑问:什么时候选择Hilo?
    7、uuid:
         id必须是String类型。
       使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
        特点:能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间。
    8、guid
          使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL。
          MySql中,先执行select uuid()。 uuid()是MySql自带的函数,取得uuid值后再生成主键。
    9、select:使用数据库触发器赋值  (待研究)
    10、foreign:使用外键赋值,在一对一实体关系时,可以保证关系双方的id保持一致。(待研究)

  • 相关阅读:
    Unity打包ARCore项目失败,但是其他安卓项目成功
    关于Unity 图片队列存储以及出列导致内存溢出的解决方案
    unity 使用 outline 组件
    7Z解压工具的BUG
    Unity ILRuntime 调用方法一览
    Python 免费插件
    SQL经典面试题及答案
    PL/SQL Developer中文注释乱码的解决办法
    Tomcat并发优化和缓存优化
    在配置hibernate.cfg.xml时需指定使用数据库的方言:
  • 原文地址:https://www.cnblogs.com/a1280055207/p/3173258.html
Copyright © 2011-2022 走看看