在上篇博文中少提了一点,Hibernate
主键的生成策略,这里简单记录一下。
首先先了解一下主键生成策略,就是指主键生成器,负责生成数据表记录的主键。
1
、自动增长identity
identity
由底层数据库于为long
、short
、int
类型生成唯一标识符。identity
是由数据库自己生成的,但这个主键必须设置为自增长。使用SQL
Server
和 MySQL
的自增字段,这个方法不能放到
Oracle
中,Oracle
不支持自增字段,要设定sequence
(DB2
和 Oracle
中很常用)
特点:与底层数据库有关,要求数据库支持Identity
,如MySQl
中是 auto_increment, SQL Server
中是Identity
,支持的数据库有MySql
、SQL Server
、DB2
、Sybase
和HypersonicSQL
。 Identity
无需Hibernate
和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。
2
、sequence
Sequence
需要底层数据库支持Sequence
方式,例如DB2
、Oracle
均支持的序列,用于为long
、short
或int
生成唯一标识
特点:需要底层数据库的支持序列,支持序列的数据库有DB2
、PostgreSql
、Qracle
、SAPDb
等在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件
3
、hilo
Hilo
使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo
方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是hibernate_unique_key
,默认字段叫作next_hi
。next_hi
必须有一条记录否则会出现错误。
特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo
主键生成方式由Hibernate
维护,所以Hilo
方式与底层数据库无关,但不应该手动修改hi/lo
算法使用的表的值,否则会引起主键重复的异常。
4
、native
Native
主键生成方式会根据不同的底层数据库自动选择Identity
、Sequence
、Hilo
主键生成方式。比较常用。
特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate
会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
5
、seqhilo
sequence
和hilo
的结合,hilo
的高位由sequence
产生,所以也需要底层数据库的支持
通过hilo
算法实现,但是主键历史保存在Sequence
中,适用于支持 Sequence
的数据库,如 Oracle
(比较少用)
6
、increment
这个是由Hibernate
在内存中生成主键,每次增量为1
,不依赖于底层的数据库,因此所有的数据库都可以使用,但问题也随之而来,由于是Hibernate
生成的,所以只能有一个Hibernate
应用进程访问数据库,否则就会产生主键冲突,不能在集群情况下使用
插入数据的时候hibernate
会给主键添加一个自增的主键,但是一个hibernate
实例就维护一个计数器,所以在多个实例运行的时候不能使用这个方法
7
、uuid.hex
UUID
使用128
位UUID
算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
特点;
能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间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
:代理主键,适合于Mysql
或ms sql server
等支持自增的dbms
,主键值不由hibernate
维护。
3
、sequence
:代理主键,适合于oracle
等支持序列的dbms
,主键值不由hibernate
维护,由序列产生。
4
、native
:代理主键,根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql
或sqlserver
,选择identity
,如果是oracle
,选择sequence
。
5
、hilo
:代理主键,hibernate
把特定表的字段作为hign
值,生成主键值
6
、uuid.hex
:代理主键,hibernate
采用uuid 128
位算法生成基于字符串的主键值
7
、assign
:适合于应用程序维护的自然主键。
以上记住几个常用的,其他的以了解为主。
分享到:
相关推荐
3. `hibernate-tools`: 提供了Hibernate相关的辅助工具,如逆向工程(用于生成实体类)、HBM2DDL(用于生成数据库脚本)等。 4. `hibernate-annotations`: 提供注解方式的ORM支持。 5. `hibernate-jpa-2.0-api`: JPA...
Hibernate3.6.2API开发文档。chm格式的。
《Hibernate 3.6.2 API及jar包详解》 Hibernate,作为一个强大的对象关系映射(ORM)框架,是Java开发中的重要工具。本资源集合包含`hibernate-distribution-3.6.2`版本的API中文文档以及相关的jar包,旨在帮助...
Hibernate 3.6.2 API,根据官方文档转换而来,雅黑美化版
hibernate API 3.6.2.CHM 非常详细的hibernate api
2. **配置Hibernate**:编写hibernate.cfg.xml配置文件,指定数据库连接信息、方言、缓存策略等。 3. **映射对象**:创建实体类并使用注解或XML文件定义其与数据库表的映射关系。 4. **配置log4j**:根据需求调整log...
在Hibernate中,它主要用于动态生成持久化类的代理对象,以实现透明化持久化,以及对JPA注解的支持。 3. **commons-collections-3.1.jar**:Apache Commons Collections是Java集合框架的扩展,提供了许多实用的集合...
字段则通过注解@Id、@GeneratedValue等来标记主键和生成策略。 4. **会话(Session)**:Hibernate的核心接口之一,它是与数据库交互的主要入口,提供了持久化操作的方法,如save()、update()、delete()、load()和...
hibernate-tools-3.6.2.Final
在插件方面,Maven 3.6.2支持了更多的插件和更新了现有的插件,这些插件可以扩展Maven的功能,例如,Javadoc插件用于生成API文档,Surefire插件用于运行单元测试,Failsafe插件则用于集成测试。这些插件的增强使得...
这是从官网下的hibernate的最新版本 有需要的自己下的 官网的下载感觉不太稳定
** Maven 3.6.2 资源包详解与设置指南 ** Maven 是一个强大的 Java 项目管理工具,它极大地简化了构建、依赖管理和项目生命周期管理的过程。Maven 3.6.2 是一个稳定的版本,包含了多项优化和改进,旨在提高开发效率...
Python 3.6.2是Python编程语言的一个重要版本,发布于2017年,为开发者提供了多项改进和新特性。在这个版本中,Python在性能、语法、库支持以及错误修复方面都有所提升,使其成为当时开发者的热门选择。以下是对这个...
ice-3.6.2.jar,ice-3.6.2.jarice-3.6.2.jar,ice-3.6.2.jar
Maven的工作流程主要包括解析POM文件,管理项目依赖,执行构建生命周期的不同阶段(如编译、测试、打包、部署等),以及生成项目相关的报告。它通过插件机制来完成这些任务,插件可以在`pom.xml`文件中声明,并且...
Python 3.6.2 是一个重要的版本更新,在Python编程语言的发展历程中具有显著的地位。这一版本主要聚焦于性能优化、错误修复以及新特性的引入,使得它在Linux操作系统上成为一个理想的选择。作为一款跨平台的高级编程...
在“apache-maven-3.6.2”这个压缩包中,我们获得了Maven 3.6.2的完整版本。这个版本是Maven的一个稳定版本,包含了执行构建、解析依赖、生成文档以及执行各种构建任务所需的所有组件。 Maven 的工作流程主要围绕...
INET Framework 3.6.2 是一个用于网络模拟的开源组件,主要设计用于OMNeT++仿真环境。这个组件提供了一系列的模型,涵盖了各种网络层次,包括物理层、数据链路层、网络层、传输层以及应用层。INET Framework使得用户...
Apache Maven,是一个软件项目管理及自动构建工具,由Apache软件基金会所提供,一个开源项目,由 Java 开发,并且只是用来管理 Java 项目的。 版本:apache-maven-3.6.2-bin.zip
索引过程中可以设置不同的字段类型(如存储、不存储、可搜索等)和分词策略。 4. **查询解析(Query Parsing)**: Lucene提供了强大的查询解析框架,可以将用户输入的查询字符串转换为内部表示。3.6.2版本支持多种...