首页 > 代码库 > 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及主键生成策略