当前位置: 首页 > news >正文

hibernate自定义主键

 

关键字: hibernate 1) assigned
主键由外部程序负责生成,无需Hibernate参与。

2) hilo
通过hi/lo 算法实现的主键生成机制,需要额外的数据库表保存主
键生成历史状态。

3) seqhilo
与hilo 类似,通过hi/lo 算法实现的主键生成机制,只是主键历史
状态保存在Sequence中,适用于支持Sequence的数据库,如Oracle。

4) increment
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持
一个变量,以保存着当前的最大值,之后每次需要生成主键的时候
将此值加1作为主键。
这种方式可能产生的问题是:如果当前有多个实例访问同一个数据
库,那么由于各个实例各自维护主键状态,不同实例可能生成同样
的主键,从而造成主键重复异常。因此,如果同一数据库有多个实
例访问,此方式必须避免使用。

5) identity
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL
中的主键生成机制。

6) sequence
采用数据库提供的sequence 机制生成主键。如Oralce 中的
Sequence。

7) native
Hibernate根据底层数据库自行判断采用identity、hilo、sequence
其中一种作为主键生成方式。

8) uuid.hex
Hibernate基于128 位唯一值产生算法生成16 进制数值(编码后
以长度32 的字符串表示)作为主键。

9) uuid.string
与uuid.hex 类似,只是生成的主键未进行编码(长度16)。在某些
数据库中可能出现问题(如PostgreSQL)。

10) foreign
使用外部表的字段作为主键。
一般而言,利用uuid.hex方式生成主键将提供最好的性能和数据库平台适
应性。

另外由于常用的数据库,如Oracle、DB2、SQLServer、MySql 等,都提
供了易用的主键生成机制(Auto-Increase 字段或者Sequence)。我们可以在数
据库提供的主键生成机制上,采用generator-class=native的主键生成方式。
不过值得注意的是,一些数据库提供的主键生成机制在效率上未必最佳,
大量并发insert数据时可能会引起表之间的互锁。
数据库提供的主键生成机制,往往是通过在一个内部表中保存当前主键状
态(如对于自增型主键而言,此内部表中就维护着当前的最大值和递增量),
之后每次插入数据会读取这个最大值,然后加上递增量作为新记录的主键,之
后再把这个新的最大值更新回内部表中,这样,一次Insert操作可能导致数据
库内部多次表读写操作,同时伴随的还有数据的加锁解锁操作,这对性能产生
了较大影响。
因此,对于并发Insert要求较高的系统,推荐采用uuid.hex 作为主键生成
机制。

相关文章:

  • 2017.3.9 组合数学学习——组合、多重集排列
  • Flex:PopUpManager的createPopUp与addPopUp区别
  • HTTP协议返回状态码
  • sql之左连接、右连接、全连接
  • c#元组举例
  • RSA证书说明
  • JavaScript学习12 JS中定义对象的几种方式【转】
  • Flex设置toolTip样式
  • fle中alert样式的设置
  • Hdu 3065 病毒侵袭持续中(AC自动机)
  • Error #2044: 未处理的 IOErrorEvent:。 text=Error #2038: 文件 I/O 错误。
  • sql server 函数详解(4)日期和时间函数
  • 【CSP】字符与int
  • flex 多文件上传
  • 网络基础
  • @jsonView过滤属性
  • Android框架之Volley
  • Angular Elements 及其运作原理
  • es6要点
  • Fundebug计费标准解释:事件数是如何定义的?
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • java概述
  • linux学习笔记
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • oschina
  • Solarized Scheme
  • 初识 webpack
  • 大数据与云计算学习:数据分析(二)
  • 官方解决所有 npm 全局安装权限问题
  • 简单易用的leetcode开发测试工具(npm)
  • 坑!为什么View.startAnimation不起作用?
  • 前端
  • 入口文件开始,分析Vue源码实现
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 温故知新之javascript面向对象
  • 我从编程教室毕业
  • 一个SAP顾问在美国的这些年
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (搬运以学习)flask 上下文的实现
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (算法)Game
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • 、写入Shellcode到注册表上线
  • . Flume面试题
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 8.0 中有哪些新的变化?
  • .NET 中让 Task 支持带超时的异步等待
  • .NET多线程执行函数
  • /dev/sda2 is mounted; will not make a filesystem here!