Hibernate学习之主键增长策略

主键增长策略

对象标识符(OIDobjectid)

从表的角度看,OID对应表的主键。从类的角度看OID对应类的主键属性.

increment:

由Hibernate自动以递增方式生成标识符,每次增量为1。

selectmax(id)fromStudent

优点:不依赖于底层数据库系统,适用于所有的数据库系统。

缺点:适用于单进程环境下,在多线程环境下很可能生成相同主键值,而且OID必须为数值类型,比如long,int,short类型

配置方式:

<idname=“id”type=”long”column=”ID”>

<generatorclass=”increment”/>

</id>

identity:

自增,每次增长1,适用于支持identity的数据(mysql,sqlserver),主键类型是数值

sequence:

依赖于底层数据库系统的序列

前提条件:需要数据库支持序列机制(如:oracle等),而且OID必须为数值类型,比如long,int,short类型。

配置文件:

<idname=”id”type=”java.lang.Long”column=”ID”>

<generatorclass=”sequence”>

<paramname=”sequence”>my_seq</param>

</generator>

</id>

native:

会根据数据类型来选择,使用identity,sequence,hilo

selecthibernate_sequence.nextvalfromdual

主键类型是数值long,short,int

<idname="id"type="java.lang.Integer">

<generatorclass="native"/>

</id>

hilo:

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

用法:

<idname=”id”type=”java.lang.Integer”column=”ID”>

<generatorclass=”hilo”>

<paramname=”table”>my_hi_value</param>

<paramname=”column”>next_value</param>

</generator>

</id>

uuid:

会根据uuid算法,生成128-bit的字串

主键属性类型不能是数值型,而是字串型

assigned:

用户自己设置主键值,所以主键属性类型可以是数值,字串

映射复合主键

foreign:

在one-to-one的关系中,有另一张表的主键(Person)来决定自己主键/外键(IdCard)

给出一个简单原则:

针对oracle[主键是int/long/short建议使用sequence]主键是String使用uuid或者assinged

针对mysql[主键是int/long/short建议使用increment/assigend,如果是字串UUId/assigned]

针对sqlserver[主键是int/long/short建议使用identity/native/assinged,如果主键是字串,使用uuid/assigned]

one-to-one又是基于主键的则使用foreign

hibernate最佳实践(在什么项目中使用最好)

对于数据量大,性能要求高系统,不太使用使用hiberante.

主要用于事务操作比较多的项目(oa/某个行业软件[石油、税务、crm,财务系统.]

不适合OLAP(On-LineAnalyticalProcessing联机分析处理),以查询分析数据为主的系统;

适合OLTP(on-linetransactionprocessing联机事务处理)

olap->hibernate用的比较少oltp->hibernate

相关推荐