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主键将提供最好的性能和数据库平台适应性。

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

常用Hibernate 主键生成策略(徐瑞文)相关推荐

  1. mysql修改主键生成策略信息_常用Hibernate 主键生成策略

    1.Assigned Assigned方式由程序生成主键值,并且要在save()之前指定否则会抛出异常 特点:主键的生成值完全由用户决定,与底层数据库无关.用户需要维护主键值,在调用session.s ...

  2. 基于按annotation的hibernate主键生成策略

    这里讨论代理主键,业务主键(比如说复合键等)这里不讨论. 一.JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id ...

  3. Hibernate主键生成策略总结(这里面讲的很详细)

    Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通 ...

  4. jpa基于按annotation的hibernate主键生成策略

    JPA注解持久化类很方便,需要jar包:ejb3-persistence.jar下载 一.JPA通用策略生成器  通过annotation来映射hibernate实体的,基于annotation的hi ...

  5. JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

  6. Hibernate主键生成策略总结

    Hibernate提供的主键生成策略,使我们可以在实体类的映射xml文件中设定关键字来告诉hibernate我们要使用的主键生成方式,然后hibernate会根据设定完成数据库的主键控制. 一.首先通 ...

  7. JPA实体注解与hibernate主键生成策略

    JPA实体注解与hibernate主键生成策略 用hibernate注解开发项目,对于主键的生成策略有些模糊,下面是从新浪网里面看到的一篇关于hibernate注解以及主键生成策略的文章,值得一看: ...

  8. 【吐血整理】Hibernate常用的主键生成策略的原理、优缺点、应用场合

    // 此文由老猫烧须整理,其中加上本人的使用教程,如有误,欢迎指出 // 仅作学习以及备份使用,转载如带有本人整理资料请注明出处 // 欢迎大家留言交流 简介版: increment:代理主键,适合于 ...

  9. 【Hibernate】hibernate主键生成策略与配置详解

    //####################################################### **Hibernate各种主键生成策略与配置详解** //############# ...

最新文章

  1. 美多后台管理和项目环境搭建
  2. 首次适应算法_CVPR 2020丨?商汤TSD目标检测算法获得Open Images冠军
  3. 漢城博殺的日子 (一)
  4. IDEA下SSM项目搭建的基本操作
  5. 我的python之路(二):python环境安装
  6. LeetCode 669. 修剪二叉搜索树(Trim a Binary Search Tree)
  7. oracle solaris 10 系统 下载,更新 Oracle Solaris 11 系统中的软件
  8. Java的8种基本数据类型
  9. 利用JavaScript在canvas中画一棵树
  10. 简述利用PE系统破解Windows密码
  11. ux设计_我是一名开发人员,正在过渡到UX设计帮助
  12. 自定义桌面右键菜单-Win 10 版
  13. shell怎样循环遍历字符串数组
  14. 奔三之际,任性一把 ——从华为南研所裸辞后的一些体会和感想
  15. 电路原理计算机,电路原理A卷(07计算机).doc
  16. 首次使用Neptune3000海底静力触探CPT记录
  17. 在linux下设置php效劳器Apache2.2.3 mysql5.0.22 php5.2.0(2)
  18. K8s 部署java项目
  19. 初中英语语法(001)-名词和冠词
  20. OS模块(包) - 2

热门文章

  1. 怎样用空气炸锅做红烧肉
  2. 32单片机,硬件电路,计算机,细碎知识【7000字】【来源工作日记】【原创】
  3. 5G协议标准下载、关于5G的一些故事!
  4. 计算机管理无法关闭,任务管理器无法关闭的解决方法
  5. 性能服务器图片介绍大全,IDF2012:英特尔22nm处理器图形性能介绍
  6. 图形设计六字诀影叠置断悖质优漫动
  7. Ubuntu下FastDFS的安装
  8. 本地搭建Minio服务及通过Nginx代理进行文件下载
  9. 适合学生党的蓝牙耳机有哪些?平价好用的蓝牙耳机推荐
  10. k8s执行 kubeadm join token id i6q6rl is invalid for this cluster or it has expired.