【Hibernate】——常用主键生成策略
来源:互联网 发布:淘宝网9.9包邮 编辑:程序博客网 时间:2024/06/11 13:37
1、identity
identity由底层数据库生成标识符。identity是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型,如DB2、SQL Server、MySQL、Sybase和HypersonicSQL等,Oracle这类没有自增字段的则不支持。
<id name="id" column="id"> <generator class="identity" /></id>
例:如果使用MySQL数据库,则主键字段必须设置成auto_increment。特点:只能用在支持自动增长的字段数据库中使用,如MySQL。
2、sequence
采用数据库提供的sequence机制生成主键,需要数据库支持sequence。如oralce、DB、PostgerSQL中的sequence。MySQL这种不支持sequence的数据库则不行(可以使用identity)。
<generator class="sequence"> <param name="sequence">hibernate_id</param></generator><param name="sequence">hibernate_id</param> 指定sequence的名称
Hibernate生成主键时,查找sequence并赋给主键值,主键值由数据库生成,Hibernate不负责维护,使用时必须先创建一个sequence,如果不指定sequence名称,则使用Hibernate默认的sequence,名称为hibernate_sequence,前提要在数据库中创建该sequence。
特点:只能在支持序列的数据库中使用,如Oracle。
3、uuid
Universally Unique Identifier,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。生成随机字符串。
<id name="id" column="id"> <generator class="uuid" /></id>
Hibernate在保存对象时,生成一个UUID字符串作为主键,保证了唯一性,但其并无任何业务逻辑意义,只能作为主键,唯一缺点长度较大,32位(Hibernate将UUID中间的“-”删除了)的字符串,占用存储空间大,但是有两个很重要的优点,Hibernate在维护主键时,不用去数据库查询,从而提高效率,而且它是跨数据库的,以后切换数据库极其方便。特点:uuid长度大,占用空间大,跨数据库,不用访问数据库就生成主键值,所以效率高且能保证唯一性,移植非常方便,推荐使用。
4、native
native由hibernate根据使用的数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式,灵活性很强。如果能支持identity则使用identity,如果支持sequence则使用sequence。
<id name="id" column="id"> <generator class="native" /></id>
例如:MySQL使用identity,Oracle使用sequence注意:如果Hibernate自动选择sequence或者hilo,则所有的表的主键都会从Hibernate默认的sequence或hilo表中取。并且,有的数据库对于默认情况主键生成测试的支持,效率并不是很高。使用sequence或hilo时,可以加入参数,指定sequence名称或hi值表名称等,如
<param name="sequence">hibernate_id</param>
特点:根据数据库自动选择,项目中如果用到多个数据库时,可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等。5、assigned
主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。
<id name="id" column="id"> <generator class="assigned" /></id>
“ud”是自定义的策略名,人为起的名字,后面均用“ud”表示。特点:可以跨数据库,人为控制主键生成,应尽量避免。
6、foreign
使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。
<id name="id" column="id"> <generator class="foreign"> <param name="property">user</param> </generator></id><one-to-one name="user" class="domain.User" constrained="true" />
该例使用domain.User的主键作为本类映射的主键。特点:很少使用,大多用在一对一关系中。
- 【Hibernate】——常用主键生成策略
- hibernate主键:常用Hibernate主键生成策略
- 常用Hibernate主键生成策略
- hibernate 常用主键生成策略
- Hibernate-----Hibernate常用主键生成策略
- 【Hibernate】——主键生成策略
- 常用的hibernate中的主键生成策略
- Hibernate中常用的主键生成策略
- 常用的Hibernate主键生成策略
- 常用hibernate主键生成策略详解
- Hibernate常用的主键生成策略
- hibernate常用主键生成策略简略
- Hibernate:常用的主键生成策略
- Hibernate常用的主键生成策略
- 常用Hibernate 主键生成策略(徐瑞文)
- Hibernate中常用的主键生成策略
- hibernate主键生成策略
- Hibernate 主键生成策略
- 数据结构---线索二叉树
- C# Word文档打印方法
- 定时器-图片或者文字上下播放
- TF/06_Neural_Networks/05 06 07 08
- 终于有自己的博客了
- 【Hibernate】——常用主键生成策略
- HotSpot虚拟机在java堆中的内存使用
- python3进阶学习总结——简单爬虫实现
- 保存缓存
- TCP连接与释放期间的四种定时器
- 查找算法总结(2)--哈希表
- java访问权限和继承性
- POJ 1344 Tree Size Problem 笔记
- jQuery实现清空table表格除首行外的所有数据