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

xiaoxiao2021-02-28  81

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

转载请注明原文地址: https://www.6miu.com/read-55084.html

最新回复(0)