`
tansitongba
  • 浏览: 503484 次
文章分类
社区版块
存档分类
最新评论

Follow Me:深入浅出学习Hibernate四:主键生成策略

 
阅读更多

ORM映射基本原理

1. 基于相同实体类和表,实现相互映射,类的对象对应了表中的记录,不同对象对应不同的记录,不同的记录对应不同的对象

2. 表中不同的记录通过主键来区分,不同的对象通过对象id来区分,对象id是对象中的一个成员变量,该变量的值唯一性的标识了对象。

3.对象id和表主键的映射构成了ORM的核心

4.数据库往往具备特定的主键生成算法,而对象系统则不具备,所以要配置特定的策略,以使对象具备和数据库中的数据同步的对象标识。

配置主键生成策略

1.主键生成策略是通过配置文件来实现的

2. 映射文件中<id>标签对应的是表中的主键列

3.<generator>子标签配置主键的生成策略

4.class属性值指定具体的策略,可以有以下identity,sequence,hilo,native,swqhilo,increment,uuid,assigned,foreign,select

主键生成策略格式

<id name="id" column="表主键字段名" type="java.lang.Integer">

<generator class="设置主键生成策略类型"/>

</id>

常用主键生成方式

1.Assigned

Assigned方式由程序生成主键值,并且要在save()之前指定否则会抛出异常

特点:主键的生成值完全由用户决定,与底层数据库无关。用户需要维护主键值,在调用session.save()之前要指定主键值。

2.Hilo

Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认请况下使用的表是

hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。

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

3.Increment

Increment方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库的支持Sequence。如Oracle,DB2等。需要在映射文件xxx.hbm.xml中加入Increment标志符的设置。

特点:由Hibernate本身维护,适用于所有的数据库,不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。

4.Identity

Identity当时根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。

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

5.Sequence

Sequence需要底层数据库支持Sequence方式,例如Oracle数据库等

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

6.Native

Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式。

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

7.UUID

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

特点;能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间

8.Foreign

Foreign用于一对一关系中,保证生成主键的唯一性,支持SQL Server和MySQL。

对数据的依赖总结

1.UUID、increment、Hilo、assigned对数据库无依赖

2.identity:依赖Mysql或sql server,主键值不由Hibernate维护

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

4.native:根据底层数据库的具体特性选择适合的主键生成策略,如果是mysql或sqlserver,选择identity,如果是oracle,选择sequence。

总结

提高系统新能的主要做法就是显著减少数据库的访问次数。通过上面的分析,可作为我们考虑的一个指标。利用uuid方式生成Hibernate主键将提供最好的性能和数据库平台适应性。

大家积极交流,自己项目中的主键生成是什么策略,以及优缺点是什么,是如何处理的,给项目带来的好处。

分享到:
评论

相关推荐

    followme:RoboCup @ home SPL中的Followme代码

    followme(靛蓝)-0.0.1-0 通过在Thu, 02 Jul 2015 05:33:48 -0000运行/usr/bin/bloom-release --rosdistro indigo --track indigo followme ,将followme存储库中的软件包发布到了indigo发行版中。 followme...

    圆梦小车FollowMe全集

    "圆梦小车FollowMe全集"是一套专注于智能机器人技术的教育资源,旨在帮助学习者了解和掌握如何设计、编程以及操控智能跟随车辆。在这个全集中,我们可以期待涵盖多个方面的内容,包括硬件构建、软件开发、传感器应用...

    寻迹小车 FollowMe 项目

    "寻迹小车 FollowMe 项目"是一个基于C语言编程的智能小车开发项目,旨在实现小车能够自动追踪预设路径或者跟随特定目标移动。在这个项目中,开发者需要掌握C语言的基础语法以及一些高级特性,同时理解嵌入式系统的...

    Follow-Me:深度学习架构可帮助无人机瞄准并关注人们

    $ git clone https://github.com/BrunoEduardoCSantos/Follow-Me.git 安装依赖项 您需要安装Python 3和Jupyter Notebooks才能执行此项目。 如果还没有安装的话,最好的方法是将Anaconda与一起使用。 如果出于某种...

    FollowMe:android 项目 - 该应用程序提供跟踪和紧急警报服务

    "FollowMe"是一款基于Android平台的应用程序,旨在为用户提供实时跟踪和紧急报警功能,以增强个人安全保障。本文将深入探讨这款应用背后的开发技术,主要围绕Java编程语言进行讲解。 一、应用概述 "FollowMe"是一款...

    ardrone_followme:ROS-stack 来制作一个跟随一个人的 AR.Drone。 基于AutonomyLabardrone_autonomy

    ardrone_followme ROS-stack 来制作一个跟随一个人的 AR.Drone。 使用 AutonomyLab/ardrone_autonomy、ardrone_driver 和 ardrone_joystick。

    FollowMe轻博客

    "FollowMe轻博客"是一个基于面向对象编程和MVC(Model-View-Controller)设计模式构建的博客系统。这个系统的主要特点是结构清晰、易于维护和扩展,特别适合那些希望快速搭建个人博客或轻型社交平台的用户。"仿点点...

    followme:使用 Rails 4 + RSpec + Cucumber 进行行为驱动开发

    $ git clone git@github.com:krahman/followme.git 安装 gem $ bundle install --path vendor/bundle 迁移数据库 $ bundle exec rake db:migrate 运行用户对象单元测试 RSpec $ bundle exec rspec spec/models/...

    独立微博Follow5:30天内将暂停所有服务运营.docx

    【Follow5独立微博服务暂停】 Follow5,一个曾经备受关注的独立微博平台,于2021年11月4日宣布了一项重大决定,即在接下来的30天内暂停所有服务运营。这个消息由其运营总经理毕杨通过个人新浪微博账号发布,引发了...

    DEWI PROJECT_FOLLOWME_arduino_Microcontroller_源码

    《DEWI PROJECT_FOLLOWME_arduino_Microcontroller_源码》项目是基于Arduino微控制器实现的“Follow Me”(跟我走)程序,适用于自动购物车或类似应用。该项目旨在通过编程让设备跟随特定信号源移动,比如一个携带...

    SkyEye仿真Follow me

    ### SkyEye仿真Follow Me 关键知识点 #### 一、SkyEye简介 - **定义与目标**:SkyEye是一款开源的嵌入式系统仿真工具,旨在为开发者提供一个无需实际硬件即可进行嵌入式系统开发与研究的平台。其主要目标是在Linux...

    First集和Follow集生成算法模拟

    编译原理课程设计First集和Follow集生成算法模拟 【问题描述】 设计一个由正规文法生成First集和Follow集并进行简化的算法动态模拟 【基本要求】 动态模拟算法的基本功能是: (1) 输入一个文法G; (2) 输出由...

    Follow-me-Learning-C.zip_Follow_ Follow

    总的来说,这份"Follow-me-Learning-C.zip"压缩包为学习者提供了一条清晰的学习路径,通过系统的课程设计和实例讲解,帮助学习者逐步掌握C语言的核心概念和技术,无论是对于初学者还是有经验的程序员,都是一份宝贵...

    浅谈:nofollow标签的使用与分析

    nofollow是链接的HTML标签属性,站长和SEO人员可以通过这个属性来告诉搜索引擎不要追踪此网页上的链接,或不要追踪某个指定的链接, 这些或这个链接并不是本网站所推荐的...链接一旦使用nofollow之后,就不会导出权重了

    基于Java的Follow Me运动教练应用设计源码

    本项目为“基于Java的Follow Me运动教练应用设计源码”,包含61个文件,其中包括54个Java源文件、4个PNG图像文件、1个Gitignore忽略配置文件、1个XML配置文件以及1个YAML配置文件。该应用旨在为用户提供个性化的运动...

Global site tag (gtag.js) - Google Analytics