• Hibernate的几种主键生成策略


    主键类型:
      业务主键(natural key):业务主键的值是来源于一个业务数据。
      代理主键(surrogate key):代理主键需要采用一种方式来生成某个唯一值。

    代理主键的生成策略:
      1、hibernate的主键生成策略只能用于代理主键
      2、不同的主键生成策略需要的内容也是不同。

    Hibernate的主键生成策略:

      1、assigned:由应用程序负责生成主键标识符,通常使用在数据库中没有代理主键,使用的主键与业务相关的情况,即使用的是业务主键。这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键,不应使用业务主键。在没有指定标签时,默认就是assigned主键的生成方式。  在插入数据的时候主键由用户自己生成,Hibernate不负责生成主键。

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="assigned" />
    </id>

      2、identity:适用于MySQL、DB2、MS SQL Server,采用数据库生成的主键,用于为long、short、int类型生成唯一标识 
    使用SQL Server 和 MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段。

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="identity" />
    </id>

      3、sequence:Hibernate根据底层数据库的序列sequence来生成OID,适用于使用的数据库支持序列,用于为long、short或int生成唯一标识 。如果没有指定sequence参数,Hibernate会自动使用一个名为Hibernate_sequence的序列,但是我们也必须在数据库中建立这个序列。

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="sequence">
        <param name="sequence">sequence_name</param>
      </generator>
    </id>

      4、hilo:根据higb/low算法生成OID,Hibernate根据特定表的字段作为high值,默认是采用hibernate_unique_key表的next_hi字段的值,用于为long、short或int生成唯一标识 。它将OID的产生源分成两部分,DB中的high值+Hibernate配置文件中配置的low值,然后按照算法结合在一起产生OID值,可以在很少的连接次数内产生多条记录,提高效率。(注:我们也可以自定义表名和字段名)

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="hilo">
            <param name="table">hibernate_unique_key</param>
            <param name="column">next_hi</param>
            <param name="max_lo">200</param>
        </generator>
    </id>

      5、seqhilo:与hilo类似,也是通过high/low算法实现的OID生成机制,只是将hilo中的数据表换成了序列sequence,需要数据库中先创建sequence,适用于支持sequence的数据库。

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="hilo">
            <param name="sequence">hibernate_sequence</param>
        </generator>
    </id>

      6、native:根据底层数据库的能力,从identity、sequence、hilo中选择一个作为OID生成策略,灵活性更强。如果能支持identity则使用identity,如果支持sequence则使用sequence。但此时,如果选择sequence或者hilo,则表的所有的OID都会从Hibernate默认的sequence或者hilo表中取。并且,有的数据库对于默认情况主键生成策略的效率并不是很高。

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="native" />
    </id>

      7、increment:由Hibernate从数据中取出表主键的最大值,以这个值为基础,每次自增1,在内存中生成主键,不依赖于底层的数据库,所以可以跨数据库。(注:每个session只取一次表主键的最大值)

    <id name="userid" type="java.lang.Long">
        <column name="USERID" precision="22" scale="0" />
        <generator class="increment" />
    </id>

      8、uuid_hex(Universally Unique Identifier):是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字,标准的UUID格式为:xxxxxxxx-xxxx-xxxx-xxxxxx-xxxxxxxxxx (8-4-4-4-12),其中每个 x 是 0-9 或 a-f 范围内的一个十六进制的数字。

    <id name="id" column="id">
        <generator class="uuid" />
    </id>
  • 相关阅读:
    spring IOC
    spring IOC
    自定义UDF,UDTF函数
    vue异步 同步 等待方法执行完毕
    周总结(六)
    周总结(五)
    Downie Mac 网络视频下载工具 v3.9.1
    Sequel pro mysql 图形化工具下载
    让Mac系统读写NTFS Paragon
    framework-plugin 轻量级安卓组件化架构插件
  • 原文地址:https://www.cnblogs.com/zhoujingyu/p/4923967.html
Copyright © 2020-2023  润新知