Hibernate(11)*.hbm.xml文件中主键增长策略

来源:互联网 发布:java开发人员招聘要求 编辑:程序博客网 时间:2024/06/05 05:43

1 对象标识符(OID Object id)

hibernate中的持久化对象对应数据库中的一张数据表,因此区分不同的持久化对象,在Hibernate中是通过OID来完成的,从表的角度看,OID对应表的主键;从类的角度看OID对应类的主键属性。

2 常用8种主键增长策略

① increment标识符生成器

由HIbernate自动以递增方式生成标识符,每次增量为1.
- 优点:不依赖于底层数据库系统,适用于所有的数据库系统。
- 缺点:使用于单进程环境下,在多线程环境下很可能产生相同的主键值,而且OID必须为数值类型,比如long,int,short类型
配置方式:

<id name="sid" type="java.lang.Integer">    <column name="SID" precision="22" scale="0" />    <generator class="increment" /></id>

② identity标识符生成器

由底层数据库生成标识符。
前提条件:数据库支持自动增长字段类型,比如(SQL Server, MySQL),而且OID必须为数值类型,比如long,int,short类型。
配置方式:

<id name="sid" type="java.lang.Integer">    <column name="SID" precision="22" scale="0" />    <generator class="identity" /></id>

sequence标识符生成器

依赖于底层数据库系统的序列
前提条件:需要数据库支持序列机制(如:Oracle等),而且OID必须为数值类型,比如long,int,short类型。
配置方式:

<id name="id" type="java.lang.Integer">    <generator class="sequence">        <param name="sequence">mes_seq</param>    </generator></id>

④hilo标识符生成器

hilo标识符生成器由Hibernate按照一种hign/low算法生成标识符,它从数据库中的特定表的字段中获取high值,因此需要额外的数据库表保存主键生成的历史状态,hilo生成方法不依赖于底层数据库,因此适用于每一种数据库,但是OID必须为数值类型。
配置方式:

<id name="id" type="java.lang.Integer">    <generator class="hilo">        <param name="table">my_hi_value</param>        <param name="column">next_value</param>    </generator></id>

⑤native标识符生成器

native生成器能根据底层数据库系统的类型,自动选择合适的标识符生成器,因此非常适用于跨数据库平台开发,它会由Hibernate根据数据库适配器中的定义,自动采用identity、hilo、sequence中的一种作为主键生成方式,但是OID必须为数值类型。
配置方式:

<id name="sid" type="java.lang.Integer">    <column name="SID" precision="22" scale="0" />    <generator class="native" /></id>

assigned标识符生成器

采用assigned生成策略,表示由应用程序逻辑(手动指定)来负责生成主键标识符,OID类型没有限制
配置方式:

<id name="sid" type="java.lang.Integer">    <column name="SID" precision="22" scale="0" />    <generator class="assigned" /></id>

⑦uuid标识符生成器

由Hibernate基于128位唯一值产生算法,根据当前设备IP,时间,JVM启动时间,内部自增量等4个参数生成16进制数值作为主键,一般而言,利用uuid方式生成的主键提供最好的数据插入性能和数据库平台适应性。OID使用String类型,不能使用数值型
配置方式:

<id name="sid" type="java.lang.String" column="SID">    <generator class="uuid" /></id>

foreign标识符生成器

在one-to-one的关系中,有一张表的主键来决定自己的主键/外键(http://blog.csdn.net/u013943420/article/details/71195266#t3)
配置方式:

<many-to-one name="student" class="com.test.domain.Student" fetch="select">    <column name="SID" precision="22" scale="0" /></many-to-one>

⑨复合主键(至少两个字段组合作为主键)

在*.hbm.xml中的配置:
第一种方式:以独立主键类映射复合主键,这样达到将逻辑加以隔离的目的;

<composite-id name="id" class="com.test.domain.StudentId">    <key-property name="cusname" type="java.lang.String">        <column name="STUNAME" length="40"></column>    </key-property>    <key-property name="homeaddress" type="java.lang.String">        <column name="HOMEADDRESS" length="50"></column>    </key-property></composite-id>

3 OID生成策略选用简单原则

- 针对Oracle:主键是数值型,一般选择sequence;主键是String类型,使用uuid或assigned
- 针对MySQL:主键是数值型,一般选择increme/assigned;主键是String类型,使用uuid或assigned
- 针对SQLServer:主键是数值型,一般使用identity、native、assigned;主键是String,使用uuid或assigned

0 0