Hibernate主键生成策略
Hibernate主键生成策略有很多种,正如设置不同的数据类型一样,设置不同的主键生成策略,也是适用于不同的场景。接下来一一来看不同的生成策略,有什么作用和优缺点。
1、identity[自然递增]
identity是底层数据库生成的标识符。identity是由数据库自己生成的,而且这个主键必须设置为自增长的,使用identity的前提是数据库必须支持自增长的类型,如mysql、SQL server等,而Oracle没有自增长字段故不支持。
缺点:由于需要数据库来维护,会占用数据库资源。
<id name="id" column="id"> <generator class="identity"> </id>
2、sequence[序列]
需要底层数据库的支持,并由数据库维护这个sequence序列。支持Oracle、DB2等数据库,用于long或short或int类型生成唯一标识。
<generator class="sequence"> <param name="sequence">hibernate_id</param> </generator> <param name="sequence">hibernate_id</param> 指定sequence的名称
注意:Hibernate生成主键时,查找sequence并赋给主键值,主键值由数据库生成,Hibernate不负责维护,使用前必须先创建一个sequence。
3、native
根据数据库自动选择生成策略,对于mysql、SQL server采用identity生成策略;对于Oracle,则采用sequence策略。
<id name="id" column="id"> <generator class="native" /> </id>
4、uuid
UUID全程:universally unique identifier 。采用128位算法生成主键,能够保证网络环境下主键唯一性,也能够保证在不同数据库及不同服务下主键的唯一性。
Hibernate在保存对象时,生成一个UUID主键,保证了唯一性,不用去查询数据库,有Hibernate自己维护,从而提高了效率,而且由于是跨数据库的,以后切换数据源极其方便。
特点:
UUID 长度达,唯一性、占用数据库。
跨数据库,移植方便。
不用访问数据库生成主键,效率高。
<id name="id" column="id"> <generator class="uuid" /> </id>
5、foreign
使用另外一个相关联的对象的主键作为该对象主键。主要用于一对一关系中。
<id name="id"> <generator class="foreign"> <span style="white-space:pre"> </span> <param name="property">idCard</param> </generator> </id> <property name="name"/> <one-to-one name="idCard" constrained="true"/>
注:实际中很少采用该方式,这种方式只针对一对一,当需要需要变化,需要改变为一对多非常困难。
总结:
Hibernate的主键生成策略,除了这五种还有assigned,increment,Hilo等,但这五种更加常见,我们在现实中用到的最多的UUID,这个方式由Hibernate来为主键赋值,不是由程序生成,保证了对象标识符的唯一性与不可变行,而且与其他的需要由数据库来维护主键的生成策略来说效率更高,而且可移植性更高,所以这也是为什么UUID受欢迎的原因。