首页 > 代码库 > OID及主键生成策略
OID及主键生成策略
~~~
OID
~~~
1,对象里面没有主键的概念,对象中对应主键的属性,称为OID(对象标识符);
例如:
1 private Long id;//OID
<id name="id" column="s_id"><generator class="native"/></id>
2,OID用来唯一标明一个对象实体(加上对象类型)
3,OID在对象里面不见得只有一个属性;(映射复合主键)
4,OID是一种特殊的属性,所以属性上的column,type,access都可以在<id>元素使用;
5,OID分为自然主键和代理主键;(推荐使用代理主键;)
自然主键:使用对象本身的一些属性作为主键(例如用身份证号做主键);
代理主键:使用和对象没有关系的标识作为主键;
6,一般情况下,会使用OID来重写equals和hashCode方法;
~~~
主键生成策略:
~~~
1,assigned(*):针对自然主键来说;(手动设置主键值,都用assigned)
assigned只能针对一个自然主键来说;
<id name="id" column="s_id"><generator class="assigned"/></id>
---->运行会报以上的错误,id必须手动添加
2,uuid:使用UUID来生成主键
1,主键的类型必须是string;
2,主键的值是hibernate生成的,所以hibernate在插入对象之前,已经知道对象的主键值了;
3,可以使用UUID,
private String id;//OID
<id name="id" column="s_id"><generator class="uuid"/></id>
3,increment
1,主键类型需要是long ,integer等可以增加的数字类型;
2,首先查询出当前表最大的id,id+1再设置为当前对象的主键值;
3,hibernate会把每一个类型的increment值缓存起来,提高性能;
4,hibernate在插入对象之前,已经知道对象的主键值了
5,increment性能较高,不能在集群的环境下使用;
4,identity;使用数据库本身的自增主键生成方式;
1,对于MYSQL来说,其实我们使用native的时候,就是使用了identity方式;
2,要使用identity,必须要求数据库支持自增的方式
3,有的数据库不支持(比如Oracle), 有的支持(如:SQL SERVER)
不支持数据库的迁移;
5,native(*):native就是使用数据库支持的主键生成方式;
对于MYSQL来说,使用identity;
对于ORACLE来说,使用sequence
OID及主键生成策略