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、还可以自己生成主键