概述
在javabean的配置hbm.xml下的【 <hibernate-mapping>】里关于【<generator class="">】标签里的主键策略。
分类
increment
整型
Hibernate中提供的一种增长机制,不能再集群环境下或者有并发访问的情况下使用
原理:先进行查询【select max(id) from table】
再进行插入:获取最大值+1作为新的记录的主键
示例:
<!-- javabean与表的映射关系 --> <hibernate-mapping> <class name="com.yiki.bean.Person" table="person"> <!-- 主键对应 --> <id name="pid" > <!-- 自增长 --> <generator class="increment"></generator> </id> <property name="name" /> </class> </hibernate-mapping>
identity
整型由数据库来维护,所以必须使用在有自动增长的数据库中,采用的是数据库底层的自动增长机制【auto_increment】
原理:【insert into table ...】所以没有任何其他主键策略,可以得知其底层是数据库自己维护的
<generator class="identity"></generator>
sequence
整型底层是序列的增长方式,适用于Oracle数据库,因为Oracle数据库底层没有自动增长。
uuid
由框架产生,使用随机的String字符作为主键,产生的是32位随机数,一个线程下产生一个,可以多线程
private int pid; private String name; private String uuid;//这个才是主键了 public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid;
<!-- 主键对应 --> <id name="uuid" > <generator class="uuid"></generator> </id>
native
本地策略,根据底层数据库的不同,自动选择适用于该数据库的主键生成策略
如:mysql-->identity
Oracle-->sequence
assigned
唯一一个自然主键的设置方式,主键生成不用hibernate管理,需要手动设置主键
如果id是主键,在测试中要【p.setId】把id设置
<!-- 主键对应 --> <id name="uuid" > <generator class="assigned"></generator> </id>
public void save(){ Person person = new Person(); person.setName("ttt"); person.setUuid(UUID.randomUUID().toString()); session.save(person); tr.commit(); }