zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    Mac OS 下包管理器 homebrew的安装
    草根程序员八年百万年薪之路
    div隐藏滚动条,仍可滚动
    感觉身体被掏空by彩虹室内合唱团
    添加bash命令
    mysql性能优化
    PHP变量存储结构
    轻量级MVC框架(自行开发)
    一致性hash算法之php实现
    redis安装
  • 原文地址:https://www.cnblogs.com/zhoujingyu/p/4923967.html
Copyright © 2011-2022 走看看