Hibernate 各种主键生成策略

1 · hibernate的主键生成器:

  • generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 。
  • 程序员自己控制:assigned
  • 数据库控制: identity(标识列/自动增长) sequence
  • hibernate控制:increment uuid/uuid.hex
  • 其它:native

2. 主键生成器要求

  • assigned
    数据类型不限、保存前必须赋值
    特点:可以跨数据库,人为控制主键生成,应尽量避免。
<!-- 程序员自己控制 -->
	<!-- <generator class="assigned"></generator> -->
  • identity(重点掌握)
    数字,无需赋值

是由数据库自己生成的,但这个主键必须设置为自增长,使用identity的前提条件是底层数据库支持自动增长字段类型
特点:只能用在支持自动增长的字段数据库中使用,如MySQL。

  • sequence(重点掌握)
    数字,无需赋值, 默认使hibernate_sequence这个序列,
    也可以通过sequence/sequence_name参数赋值
    特点:只能在支持序列的数据库中使用,如Oracle。
<!-- 数据库控制 -->
			<!-- <generator class="sequence">
				<param name="sequence_name">xxxs</param>
			</generator> -->
  • increment

    数字,无需赋值
    官方文档:只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不要使用。

特点:跨数据库,不适合多进程并发更新数据库,适合单一进程访问数据库,不能用于群集环境。

<!-- 交给hibernate来控制 -->
		<generator class="increment"></generator>
  • uuid/uuid.hex (是由容器自动生成的一个32位的字符串,.hex代表的是十六进制)
    32位的字符串,无需赋值,
    特点:uuid长度大,占用空间大,跨数据库,不用访问数据库就生成主键值,所以效率高且能保证唯一性,移植非常方便,推荐使用。
<!-- <generator class="uuid"></generator> -->
  • native(重点掌握)
    等于identity+sequence
    特点:根据数据库自动选择,项目中如果用到多个数据库时,可以使用这种方式,使用时需要设置表的自增字段或建立序列,建立表等。

3. 自定义主键生成器

  • 3.1 *.hbm.xml指定主键生成器类

  • 3.2 创建主键生成器类
    实现org.hibernate.id.IdentifierGenerator接口即可,并还可以实现org.hibernate.id.Configurable接口来读取一些配置信息
    PersistentIdentifierGenerator.TABLE
    PersistentIdentifierGenerator.PK

小结

1、为了保证对象标识符的唯一性与不可变性,应该让Hibernate来为主键赋值,而不是程序。

2、正常使用Hibernate维护主键,最好将主键的setter方法设置成private,从而避免人为或程序修改主键,而使用assigned方式,就不能用private,否则无法给主键赋值。

2、Hibernate中唯一一种最简单通用的主键生成器就是uuid。虽然是个32位难读的长字符串,但是它没有跨数据库的问题,将来切换数据库极其简单方便,推荐使用!

3、自动增长字段类型与序列
4、还可以自己生成主键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值