`

Hibernate3.6.2 主键生成策略

阅读更多


在上篇博文中少提了一点,Hibernate 主键的生成策略,这里简单记录一下。


首先先了解一下主键生成策略,就是指主键生成器,负责生成数据表记录的主键。


1 、自动增长identity

identity 由底层数据库于为longshortint 类型生成唯一标识符。identity 是由数据库自己生成的,但这个主键必须设置为自增长。使用SQL Server MySQL 的自增字段,这个方法不能放到 Oracle 中,Oracle 不支持自增字段,要设定sequenceDB2 Oracle 中很常用)

特点:与底层数据库有关,要求数据库支持Identity ,如MySQl 中是 auto_increment, SQL Server 中是Identity ,支持的数据库有MySqlSQL ServerDB2SybaseHypersonicSQL Identity 无需Hibernate 和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。


2 sequence

Sequence 需要底层数据库支持Sequence 方式,例如DB2Oracle 均支持的序列,用于为longshortint 生成唯一标识

特点:需要底层数据库的支持序列,支持序列的数据库有DB2PostgreSqlQracleSAPDb 等在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件


3 hilo

Hilo 使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo 方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key ,默认字段叫作next_hinext_hi 必须有一条记录否则会出现错误。

特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo 主键生成方式由Hibernate 维护,所以Hilo 方式与底层数据库无关,但不应该手动修改hi/lo 算法使用的表的值,否则会引起主键重复的异常。


4
native

Native 主键生成方式会根据不同的底层数据库自动选择IdentitySequenceHilo 主键生成方式。比较常用。

特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate 会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
5
seqhilo

sequence hilo 的结合,hilo 的高位由sequence 产生,所以也需要底层数据库的支持
通过hilo 算法实现,但是主键历史保存在Sequence 中,适用于支持 Sequence 的数据库,如 Oracle (比较少用)
 
6
increment

这个是由Hibernate 在内存中生成主键,每次增量为1 ,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate 生成的,所以只能有一个Hibernate 应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用
插入数据的时候hibernate 会给主键添加一个自增的主键,但是一个hibernate 实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法
 
7
uuid.hex

UUID 使用128UUID 算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。

特点; 能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间hibernate 会算出一个16 位的值插入


8
assigned

由应用程序负责生成主键标识符,往往使用在数据库中没有代理主键,使用的主键与业务相关的情况,如:

<id name="id" column="id" type="string">
    <generator class="assigned" />
</id>
 
这种主键的生成方式不建议使用,在数据库表设计时就应该使用代理主键(surrogate key ),不应使用自然主键(natural key 具有业务含义),在没有指定<generator> 标签时,默认就是assigned 主键的生成方式
在插入数据的时候主键由用户自己添加,hibernate 也不管


9
foreign
使用外部表的字段作为主键


10 select
使用触发器生成主键(主要用于早期的数据库主键生成机制,少用)


PS:

代理主键是指与业务无关且能唯一标识数据库中记录, 一般是数据库自动生成的, 比如mysql 可以使用auto_increment,Sql2000 可以使用identity 生成方式,oracle 可以使用sequence 生成方式 自然主键指业务相关, 由用户指定, 且能唯一标识数据库中的任意一条记录

 

总结:

1 increment :代理主键,适合于所有数据库,由hibernate 维护主键自增,和底层数据库无关,但是不适合于2 个或以上hibernate 进程。

2 identity :代理主键,适合于Mysqlms sql server 等支持自增的dbms ,主键值不由hibernate 维护。

3 sequence :代理主键,适合于oracle 等支持序列的dbms ,主键值不由hibernate 维护,由序列产生。

4 native :代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysqlsqlserver ,选择identity ,如果是oracle ,选择sequence

5 hilo :代理主键,hibernate 把特定表的字段作为hign 值,生成主键值

6 uuid.hex :代理主键,hibernate 采用uuid 128 位算法生成基于字符串的主键值

7 assign :适合于应用程序维护的自然主键。


以上记住几个常用的,其他的以了解为主。

 

分享到:
评论

相关推荐

    hibernate-distribution-3.6.2.Final-dist

    3. `hibernate-tools`: 提供了Hibernate相关的辅助工具,如逆向工程(用于生成实体类)、HBM2DDL(用于生成数据库脚本)等。 4. `hibernate-annotations`: 提供注解方式的ORM支持。 5. `hibernate-jpa-2.0-api`: JPA...

    Hibernate3.6.2API

    Hibernate3.6.2API开发文档。chm格式的。

    hibernate-distribution-3.6.2 API及jar包

    《Hibernate 3.6.2 API及jar包详解》 Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发中的重要工具。本资源集合包含`hibernate-distribution-3.6.2`版本的API中文文档以及相关的jar包,旨在帮助...

    Hibernate 3.6.2 API

    Hibernate 3.6.2 API,根据官方文档转换而来,雅黑美化版

    hibernate API 3.6.2.CHM

    hibernate API 3.6.2.CHM 非常详细的hibernate api

    hibernate3.2+mysql+log4j

    2. **配置Hibernate**:编写hibernate.cfg.xml配置文件,指定数据库连接信息、方言、缓存策略等。 3. **映射对象**:创建实体类并使用注解或XML文件定义其与数据库表的映射关系。 4. **配置log4j**:根据需求调整log...

    hibernate3.6基本jar包

    在Hibernate中,它主要用于动态生成持久化类的代理对象,以实现透明化持久化,以及对JPA注解的支持。 3. **commons-collections-3.1.jar**:Apache Commons Collections是Java集合框架的扩展,提供了许多实用的集合...

    hibernate-distribution-3.6.2.Final-dist jar包

    字段则通过注解@Id、@GeneratedValue等来标记主键和生成策略。 4. **会话(Session)**:Hibernate的核心接口之一,它是与数据库交互的主要入口,提供了持久化操作的方法,如save()、update()、delete()、load()和...

    hibernate-tools-3.6.2.Final.jar

    hibernate-tools-3.6.2.Final

    maven3.6.2版本

    在插件方面,Maven 3.6.2支持了更多的插件和更新了现有的插件,这些插件可以扩展Maven的功能,例如,Javadoc插件用于生成API文档,Surefire插件用于运行单元测试,Failsafe插件则用于集成测试。这些插件的增强使得...

    hibernate-distribution-3.6.2.Final-dist.zip

    这是从官网下的hibernate的最新版本 有需要的自己下的 官网的下载感觉不太稳定

    最新版本Python3.6.2

    Python 3.6.2是Python编程语言的一个重要版本,发布于2017年,为开发者提供了多项改进和新特性。在这个版本中,Python在性能、语法、库支持以及错误修复方面都有所提升,使其成为当时开发者的热门选择。以下是对这个...

    ice-3.6.2.jar

    ice-3.6.2.jar,ice-3.6.2.jarice-3.6.2.jar,ice-3.6.2.jar

    Python-3.6.2.tgz

    Python 3.6.2 是一个重要的版本更新,在Python编程语言的发展历程中具有显著的地位。这一版本主要聚焦于性能优化、错误修复以及新特性的引入,使得它在Linux操作系统上成为一个理想的选择。作为一款跨平台的高级编程...

    INET Framework 3.6.2组件安装包.rar

    INET Framework 3.6.2 是一个用于网络模拟的开源组件,主要设计用于OMNeT++仿真环境。这个组件提供了一系列的模型,涵盖了各种网络层次,包括物理层、数据链路层、网络层、传输层以及应用层。INET Framework使得用户...

    Lucene 3.6.2 源代码

    索引过程中可以设置不同的字段类型(如存储、不存储、可搜索等)和分词策略。 4. **查询解析(Query Parsing)**: Lucene提供了强大的查询解析框架,可以将用户输入的查询字符串转换为内部表示。3.6.2版本支持多种...

    apache-maven-3.6.2.zip

    "apache-maven-3.6.2.zip" 是Apache Maven 3.6.2版本的压缩包,包含了所有必要的组件和文件,便于用户在本地环境中安装和使用。 在提供的压缩包文件列表中,我们可以看到以下几个关键文件和目录: 1. **LICENSE**...

    kafka安装包-2.13-3.6.2

    `kafka_2.13-3.6.2` 这个版本号表示的是Kafka的一个特定发行版,其中: - `2.13` 指的是Kafka与Scala版本的兼容性。Scala是一种多范式的编程语言,Kafka的API是用Scala编写的,因此这个数字表示的是与哪个版本的...

    apache-maven-3.6.2_maven_

    在“apache-maven-3.6.2”这个压缩包中,我们获得了Maven 3.6.2的完整版本。这个版本是Maven的一个稳定版本,包含了执行构建、解析依赖、生成文档以及执行各种构建任务所需的所有组件。 Maven 的工作流程主要围绕...

Global site tag (gtag.js) - Google Analytics