hibernate主键生成机制
2016-04-27 15:24
190 查看
1.Increment:由hibernate自动以递增的方式生成表识符,每次增量为1
/*
* Hibernate: select max(pid) from person
Hibernate: insert into person (pname, psex, pid) values (?, ?, ?)
increment
hibernate内部会去查询该表中的主键的最大值,然后把最大值加1
*/
2.Identity:由底层数据库生成表识符。条件是数据库支持自动增长数据类型。
/**
* Hibernate: insert into person (pname, psex) values (?, ?)
* 因为没有发出select max语句,所以identity的效率比increment要高
* 主键不连贯
*/
3.Sequence:Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。
l
sequence 标识符生成器利用底层数据库提供的序列来生成标识符.
l
Hibernate 在持久化一个 News 对象时,
先从底层数据库的 news_seq 序列中获得一个唯一的标识号,
再把它作为主键值
l
适用范围:
•
由于 sequence 生成标识符的机制依赖于底层数据库系统的序列,
因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle
等
•
OID 必须为 long, int 或 short
类型, 如果把 OID 定义为 byte
类型, 在运行时会抛出异常
4.Native:根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo
l
native 标识符生成器依据底层数据库对自动生成标识符的支持能力,
来选择使用 identity,sequence 或 hilo
标识符生成器.
l
适用范围:
•
由于 native 能根据底层数据库系统的类型,
自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
•
OID 必须为 long, int 或 short
类型, 如果把 OID 定义为 byte
类型, 在运行时会抛出异常
5.assigned:适用于自然主键。由java程序负责生成标识符。不能把setID()方法声明为Private的。尽量避免使用自然主键。
l
hibernate和底层数据库都不帮助你生成主键,也就是说得自己在程序中手动的设置主键的值。
l
适用范围:
主键有一定的含义,需要根据业务产生的情况。
6.Uuid.hex:Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。如果主键用字符类型,并且不代表任何含义。
/*
* Hibernate: select max(pid) from person
Hibernate: insert into person (pname, psex, pid) values (?, ?, ?)
increment
hibernate内部会去查询该表中的主键的最大值,然后把最大值加1
*/
2.Identity:由底层数据库生成表识符。条件是数据库支持自动增长数据类型。
/**
* Hibernate: insert into person (pname, psex) values (?, ?)
* 因为没有发出select max语句,所以identity的效率比increment要高
* 主键不连贯
*/
3.Sequence:Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。
l
sequence 标识符生成器利用底层数据库提供的序列来生成标识符.
l
Hibernate 在持久化一个 News 对象时,
先从底层数据库的 news_seq 序列中获得一个唯一的标识号,
再把它作为主键值
l
适用范围:
•
由于 sequence 生成标识符的机制依赖于底层数据库系统的序列,
因此, 要求底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle
等
•
OID 必须为 long, int 或 short
类型, 如果把 OID 定义为 byte
类型, 在运行时会抛出异常
4.Native:根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilo
l
native 标识符生成器依据底层数据库对自动生成标识符的支持能力,
来选择使用 identity,sequence 或 hilo
标识符生成器.
l
适用范围:
•
由于 native 能根据底层数据库系统的类型,
自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发
•
OID 必须为 long, int 或 short
类型, 如果把 OID 定义为 byte
类型, 在运行时会抛出异常
5.assigned:适用于自然主键。由java程序负责生成标识符。不能把setID()方法声明为Private的。尽量避免使用自然主键。
l
hibernate和底层数据库都不帮助你生成主键,也就是说得自己在程序中手动的设置主键的值。
l
适用范围:
主键有一定的含义,需要根据业务产生的情况。
6.Uuid.hex:Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。如果主键用字符类型,并且不代表任何含义。
相关文章推荐
- 内存溢出和内存泄漏的区别
- 2016年五·一劳动节广州国际生物岛10公里环岛跑策划方案
- 在fragment中监听返回键,home键
- J2SE 之 基本语法
- Lua学习(四)函数
- zk007 zookeeper curator api
- 5.0SystemUI布局
- 使用虚拟机安装kali Linux遇到的运行问题
- DateTime 的使用技巧
- C#正则表达式 Regex 常用API
- Android中的dp,px,sp互转问题以及 View.setLayoutParams, 以及网络相关工具类
- 解决easyui 控件datagrid 二次加载问题
- 文件的输入输出
- 内存溢出
- C# 字符串中判断存在的几种模式和效率(string.contains、string.IndexOf、Regex.Match)
- ViewPager 详解(四)----自主实现滑动指示条
- IOS 写一个整洁易用的tableView
- C# chart
- 文章标题
- NetworkInterface获取主机ip,判断内外网